为什么 delete(0, tk.END) 在我的条目中留下一个字符?
Why delete(0, tk.END) leaves a character in my entry?
该脚本旨在读取二维码,这样用户就不必按回车键,也不必按任何按钮。
我正在一个字符一个字符地读取二维码;它包含一个“。”表示字符串的结尾,例如:“012-ABCDE”。
即使连续使用该脚本也能正常工作,并且该点仍在条目中。请问谁能帮我去掉那个点吗?
import tkinter as tk
import string
class mainWindow(tk.Frame):
def __init__(self, controller):
askForQRCode(self, controller)
def processQRCode(self, qrCode):
print('processing QR code {}'.format(qrCode))
class askForQRCode(tk.Frame):
def __init__(self, parent, controller):
self.parent = parent
self.givenString = ''
#PANEL QR CODE
panelQRCode = tk.PanedWindow(controller)
panelQRCode.pack(fill='both', padx=7)
# ...
#SUBJECT
fSubject = tk.LabelFrame(panelQRCode, text='Subject ID')
panelQRCode.add(fSubject, stretch='always')
label = tk.Label(fSubject, text='QR Code')
label.grid(column=0, columnspan=2, row=1)
self.qrCodeEntry = tk.Entry(fSubject)
self.qrCodeEntry.grid(column=0, columnspan=2, row=3, padx=7)
self.qrCodeEntry.focus_force()
self.qrCodeEntry.bind('<Key>', self.onQREntry)
def onQREntry(self, event):
theChar = event.char.upper()
list1 = list(string.ascii_uppercase)
list2 = ['-','0','1','2','3','4','5','6','7','8','9']
if theChar in list1 or theChar in list2:
self.givenString = self.givenString + theChar
elif theChar == '.':
self.qrCodeEntry.delete(0, tk.END)
self.parent.processQRCode(self.givenString)
if __name__ == '__main__':
root = tk.Tk()
root.title('dummy')
theMainWindow = mainWindow(root)
root.mainloop()
问题是您的 <Key>
绑定发生在小部件的默认操作之前(即:在字符实际插入到小部件之前)。
一个简单的解决方案是绑定到 <KeyRelease>
,这使默认操作(绑定到 <KeyPress>
)有机会在您的自定义代码之前得到完全处理。
有关如何处理事件的更详尽的解释,请参阅此答案:Basic query regarding bindtags in tkinter
该脚本旨在读取二维码,这样用户就不必按回车键,也不必按任何按钮。 我正在一个字符一个字符地读取二维码;它包含一个“。”表示字符串的结尾,例如:“012-ABCDE”。 即使连续使用该脚本也能正常工作,并且该点仍在条目中。请问谁能帮我去掉那个点吗?
import tkinter as tk
import string
class mainWindow(tk.Frame):
def __init__(self, controller):
askForQRCode(self, controller)
def processQRCode(self, qrCode):
print('processing QR code {}'.format(qrCode))
class askForQRCode(tk.Frame):
def __init__(self, parent, controller):
self.parent = parent
self.givenString = ''
#PANEL QR CODE
panelQRCode = tk.PanedWindow(controller)
panelQRCode.pack(fill='both', padx=7)
# ...
#SUBJECT
fSubject = tk.LabelFrame(panelQRCode, text='Subject ID')
panelQRCode.add(fSubject, stretch='always')
label = tk.Label(fSubject, text='QR Code')
label.grid(column=0, columnspan=2, row=1)
self.qrCodeEntry = tk.Entry(fSubject)
self.qrCodeEntry.grid(column=0, columnspan=2, row=3, padx=7)
self.qrCodeEntry.focus_force()
self.qrCodeEntry.bind('<Key>', self.onQREntry)
def onQREntry(self, event):
theChar = event.char.upper()
list1 = list(string.ascii_uppercase)
list2 = ['-','0','1','2','3','4','5','6','7','8','9']
if theChar in list1 or theChar in list2:
self.givenString = self.givenString + theChar
elif theChar == '.':
self.qrCodeEntry.delete(0, tk.END)
self.parent.processQRCode(self.givenString)
if __name__ == '__main__':
root = tk.Tk()
root.title('dummy')
theMainWindow = mainWindow(root)
root.mainloop()
问题是您的 <Key>
绑定发生在小部件的默认操作之前(即:在字符实际插入到小部件之前)。
一个简单的解决方案是绑定到 <KeyRelease>
,这使默认操作(绑定到 <KeyPress>
)有机会在您的自定义代码之前得到完全处理。
有关如何处理事件的更详尽的解释,请参阅此答案:Basic query regarding bindtags in tkinter