我注意到当我想做一个需要在Tkinter上同时按键的游戏时,我很快被卡住了。这就是为什么我决定创建一个允许用户获取所有活动密钥的小部件。
方法很简单:
我已经完成了这段代码:
import tkinter as tk
class Tk_Multikey(tk.Frame):
"""Allow the user to get all actived keys"""
def __init__(self, master, **kwargs):
super().__init__(master, **kwargs)
self.keysym = set()
self.keycode = set()
self.keysym_num = set()
master.bind('<KeyPress>', self.add_a_key, add='+')
master.bind('<KeyRelease>', self.discard_a_key, add='+')
def add_a_key(self, event):
"""When a key is pressed, add its keysym, keycode and keysym_num to the corresponding set"""
self.keysym.add(event.keysym.upper()) # the upper method prevents a
# bug when the user is using the Shift/Caplock key and a letter key
self.keycode.add(event.keycode)
self.keysym_num.add(event.keysym_num)
def discard_a_key(self, event):
"""When a key is released, discard its keysym, keycode and keysym_num to the corresponding set"""
self.keysym.discard(event.keysym.upper())
self.keycode.discard(event.keycode)
self.keysym_num.discard(event.keysym_num)
def __delattr__(self, nameattr):
"""The user is not allowed to delete a set"""
raise AttributeError("Unable to delete")
def get_keys(self):
return((self.keysym, self.keycode, self.keysym_num))
if __name__ == "__main__":
def update(event=None):
print("updating")
strvar_keysym.set(mtk.keysym)
strvar_keycode.set(mtk.keycode)
strvar_keysym_num.set(mtk.keysym_num)
root = tk.Tk()
mtk = Tk_Multikey(root)
mtk.pack()
root.bind('<KeyPress>', update, add='+')
root.bind('<KeyRelease>', update, add='+')
strvar_keysym = tk.StringVar()
strvar_keycode = tk.StringVar()
strvar_keysym_num = tk.StringVar()
update()
tk.Label(root, textvariable=strvar_keysym).pack()
tk.Label(root, textvariable=strvar_keycode).pack()
tk.Label(root, textvariable=strvar_keysym_num).pack()
root.mainloop()
现在我有一个我不明白的错误。
当我按A,Z,E,R时,它有效;但是,如果我按A,Z,E,R T,那就不起作用(T不会出现)。但是,如果我只按A,Z,E,T,那就有效。我相信最大值是4,但我已尝试过许多其他关键而且不是那样的。 (我和W,X,C的例子有同样的错误)
为什么会发生这个错误,我该怎么做才能解决它?
谢谢:)
PS:我不知道为什么我不能在我的消息开头问好。所以我把它结束了:你好!