【问题标题】:Ignoring <Button-1> when <Key> is pressed Tkinter, Python按下 <Key> 时忽略 <Button-1> Tkinter,Python
【发布时间】:2016-01-07 14:47:38
【问题描述】:

我想通过输入的键在我的棋盘上(在第十五场游戏中)交换棋子。它非常适用于上/下/右/左,但不适用于数字键 1...9,即使它们的坐标在我的 play() 函数中正确更新,它似乎仍然没有在板上移动。我的完整代码是:http://pastebin.com/KvL2JF1G任何提示??

这是我的关键事件:

def key(event):
    if event.char.isdigit():
        for j, row in enumerate(board):
            for i, char in enumerate(row):
                if char.get() == event.char:
                    print "pressed", repr(event.char),i, j
                    play(i,j)

现在主要部分在 play() 中,它改变了每个标签中与空标签交换的 string_vars(blankx,y 是空白空间的坐标):

def play(i,j):
    global blankx, blanky, game_running
    if game_running:
        # update vars if tile can be moved
        if (blankx, blanky) in [(i+1,j),(i-1,j),(i,j+1),(i,j-1)]:
            board[blanky][blankx].set(board[j][i].get())
            board[j][i].set(' ')

            blanky = j
            blankx = i

这适用于所有可视化和事件:

for j, row in enumerate(board):
    for i, string_var in enumerate(row):
        b = Label(frame, textvariable=string_var, bg='pink', width=2, height=1, font=("Times", 30, 'bold'), relief=RAISED)  
        b.grid(row=j, column=i, sticky="nsew", ipadx=8, padx=4, pady=4)
        b.bind('<Button-1>',lambda e, i=i,j=j:play(i,j))
        b.bind('<Key>', key)
        b.bind('<Right>', right_Key)
        # ... same function for left/up/down
        b.focus_set()

【问题讨论】:

    标签: python user-interface button tkinter visualization


    【解决方案1】:

    key() 中,您必须在移动时停止检查棋盘。

    现在key() 将图块移动到新位置,然后它仍在搜索,它在新位置找到相同的图块并将其移动到旧位置。

    顺便说一句:看到控制台中打印的文本 - 你看到 "pressed" 两次。

    您需要return 才能停止搜索。

    def key(event):
        print(event.widget)
        if event.char.isdigit():
            for j, row in enumerate(board):
                for i, char in enumerate(row):
                    if char.get() == event.char:
                        print "pressed", repr(event.char),i, j, blankx,blanky
                        play(i,j)
                        return # stop searching
    

    【讨论】:

    • 行得通!谢谢!所以 只拾取点击并忽略键输入对吗?同样,如果我输入 那么 事件不会拿起它?另外,关于如何输入两位数作为键的任何想法,比如移动瓷砖 13?
    • &lt;Button-1&gt; 仅表示left mouse button。 (&lt;Button-3&gt; = right mouse button)。 &lt;key&gt; 捕获所有键盘键(可能除了 CtrlShift,但我不确定) - 它也应该捕获 &lt;right&gt;。可能您不必将 &lt;key&gt;&lt;right&gt; 绑定到所有标签 - 您只能将其绑定到 root 一次。但是&lt;Button-1&gt; 必须绑定到Label。也许用字母代替数字?
    • 是的,我现在将它们绑定到root,看起来也很好!我在 Tkinter 中看到的方式是:我有一个初始窗口(根),然后我在其中创建了一个框架,其中有我的标签。如果我想让这些标签发生任何事情,我需要重新参考它们。但我想,由于标签在框架上,框架在根上,根仍然捕获关键事件。关于输入两位数的其他方法有什么想法吗?
    • 理论上你可以通过 "13" (13) 和 "1" (1) 识别,但没有特殊的方法。可能您将不得不保留列表中的键并在“短时间”后调用另一个函数以检查列表中是否有两个键。
    猜你喜欢
    • 1970-01-01
    • 2020-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-21
    • 2014-06-11
    • 1970-01-01
    • 2021-12-20
    相关资源
    最近更新 更多