在同一时间绑定多个密钥

2024-04-19 18:25:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我注意到,当我想做一个需要同时按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为例,我有相同的bug)

为什么会出现这个错误?我能做些什么来解决它?在

谢谢:)

PS:我不知道为什么我不能在信息的开头打个招呼。。所以我结束了:你好!在


Tags: thetokeyselfeventadddefroot
1条回答
网友
1楼 · 发布于 2024-04-19 18:25:16

可能的答案here。 特别是在n-key滚动更新下的this维基百科页面。在

基本上,你的键盘不能接受一定数量的键,因为它们在同一个电路上通信。这是一个硬件限制。试着找出不同的组合键,看看哪些组合可以一起工作,哪些不能

相关问题 更多 >