亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Tkinter 自定義條目小部件異常

Tkinter 自定義條目小部件異常

慕哥6287543 2023-03-08 15:46:06
我正在嘗試創建一個自定義 Tkinter Entry widget,它將在將字符插入小部件之前將小寫字符轉換為大寫字符。我知道有一些解決方案可以將按鍵釋放事件綁定到一個小部件,該小部件具有獲取小部件文本然后轉換為大寫并重新插入文本的功能。但是這些解決方案在轉換發生之前顯示小寫字符,我不想這樣做。我正在嘗試使用基于 Bryan Oakley 共享的代碼的自定義 Entry 小部件 - Tkinter adding line number to text widget此代碼非常適合自定義Text widget,我已在其他應用程序中使用過它?,F在我正在嘗試使用相同的方法來創建自定義 Entry 小部件。以下是包含自定義文本小部件和自定義輸入小部件的示例代碼:from tkinter import *class CustomText(Text):    def __init__(self, *args, **kwargs):        Text.__init__(self, *args, **kwargs)        self._orig = self._w + "_orig"        self.tk.call("rename", self._w, self._orig)        self.tk.createcommand(self._w, self._proxy)    def _proxy(self, *args):        if args[0] == "insert" and args[1] == "insert":           args =('insert', 'insert', args[2].upper())        cmd = (self._orig,) + args        result = self.tk.call(cmd)        return resultclass CustomEntry(Entry):    def __init__(self, *args, **kwargs):        Entry.__init__(self, *args, **kwargs)        self._orig = self._w + "_orig"        self.tk.call("rename", self._w, self._orig)        self.tk.createcommand(self._w, self._proxy)    def _proxy(self, *args):        if args[0] == "insert" and args[1] == "insert":           args =('insert', 'insert', args[2].upper())        cmd = (self._orig,) + args        result = self.tk.call(cmd)        return resultdef get_text():    print("TEXT widget text = ", mytext.get("1.0", "end"))    print("ENTRY widget text = " ,entryvar.get())root = Tk()entryvar = StringVar()這些解決方案適用于CustomText小部件。如您所見,字符在插入之前進行了轉換,結果就好像用戶是在按下 shift 鍵的情況下輸入字符一樣。關于為什么會發生這種情況的任何想法?
查看完整描述

1 回答

?
慕姐8265434

TA貢獻1813條經驗 獲得超2個贊

研究代碼后,我發現在條目中插入文本后,index sel.first會調用該方法。但是沒有選擇,因此會出現錯誤“選擇不在小部件中。!框架。!定制”。我不知道這是如何在常規中處理的Entry,但您可以捕獲此錯誤:


class CustomEntry(Entry):

    def __init__(self, *args, **kwargs):

        Entry.__init__(self, *args, **kwargs)


        self._orig = self._w + "_orig"

        self.tk.call("rename", self._w, self._orig)

        self.tk.createcommand(self._w, self._proxy)


    def _proxy(self, *args):

        if args[0] == "insert" and args[1] == "insert":

            args = ('insert', 'insert', args[2].upper())

        cmd = (self._orig,) + args


        try:

            return self.tk.call(cmd)

        except TclError as e:

            if args[0] == 'index' and args[1] == 'sel.first':

                pass

            else:

                raise TclError(str(e))

否則,您可以使用完全不同的方法來更改插入文本的大小寫:對條目的文本變量使用跟蹤。


class CustomEntry(Entry):

    def __init__(self, *args, **kwargs):

        Entry.__init__(self, *args, **kwargs)

        self._var = StringVar(self)

        self.configure(textvariable=self._var)

        self._var.trace_add('write', self._uppercase)


    def _uppercase(self, *args):

        self._var.set(self._var.get().upper())

使用,每次更改內容時都會調用self._var.trace_add('write', self._uppercase)該方法。_uppercase()StringVar


查看完整回答
反對 回復 2023-03-08
  • 1 回答
  • 0 關注
  • 115 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號