我在python 3 Tkinter窗口上构建了一个模拟器程序。由于我自己构建的输入程序中的错误,进展现在已经中断。
我现在正在处理的破碎代码:
from tkinter import *
root = Tk()
prompt = ' Press any key '
label1 = Label(root, text=prompt, bg='black', fg='green')
label1.grid(row=0, column=0)
prompt2=''
def key(event):
global prompt2
if event.char == event.keysym:
prompt2 = prompt2 + event.char
elif len(event.char) == 1:
prompt2 = prompt2 + event.char
else:
pass
label1.config(text=prompt2)
root.bind_all('<Key>', key)
root.update()
root.mainloop()
所以,我想做的(并尝试做)是:
但我似乎无法做到这一点。有关1或2的任何建议吗?请在评论部分告诉我。
提前致谢!
答案 0 :(得分:0)
为什么要将event.char
与event.keysym
进行比较?对于可打印字符,它始终为True
,对于字符序列和特殊字符(如⇦和↲),始终为False
。
这个怎么样(未经测试的)?
import string
import tkinter as tk
# See side note 1
def key_event(label, event):
label_text = label.cget("text")
if event.keysym == "backspace":
label.config(text=label_text[:-1])
elif event.keysym == "return":
# Disallow 'return'
pass
elif event.char in string.ascii_lowercase:
# Character is an ASCII letter
label.config(text=label_text + event.char)
def main():
root = tk.Tk()
prompt = " Press any key "
label = tk.Label(root, text=prompt, bg="black", fg="green")
label.grid(row=0, column=0)
label.bind("<Key>", lambda e: key_event(label, e))
# See side note 2
label.focus()
# Give keyboard focus
root.mainloop()
附注1:避免使用通配符导入(from ... import *
)。相反,将tkinter
'别名为“tk
:
import tkinter as tk
root = tk.Tk()
...
附注2:避免使用全局变量,更喜欢使用类(如果您知道如何正确使用它们,请参阅下面的部分示例),或者对于非常小的代码片段,使用像我这样的lambdas共享变量。
import string
import tkinter as tk
class EditableLabel(tk.Label):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.bind("<Key>", self._key_event)
def _key_event(self, event):
keysym, char = event.keysym, event.char
text = self.cget("text")
if keysym == "backspace":
self.config(text=text[:-1])
elif keysym == "return":
pass
elif char in string.ascii_lowercase + string.digits:
self.config(text=text + char)
class MyApplication(tk.Frame):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self._add_and_draw_widgets()
def _add_and_draw_widgets(self):
for i in range(3):
EditableLabel(self, text="Label #{}".format(i)).grid(column=0, row=i)
def main():
root = tk.Tk()
app = MyApplication(root)
app.grid(column=0, row=0)
root.mainloop()
if __name__ == "__main__":
main()