按下按钮并等待第二个按钮输入=游戏移动:问题

时间:2015-11-15 16:54:17

标签: python button tkinter click self

好的我的代码有问题,我知道我想要做的动作但是我无法弄清楚让你选择在哪种情况下移动。

这是我的一个按钮的示例,共有25个

self.B00 = Button(frame)
self.B00.bind("<ButtonRelease-1>", self.clicked)
self.B00.grid(row=0, column=0)
self.B00.config(height=8, width=16)

*****这是我的按钮点击移动定义*****这就是我觉得我遇到问题的地方。单击B00然后应该能够单击B04并在B04中放置一个X并将该行向左移动。发生的事情是,当我单击B04时,它正在该按钮上启动if语句,而不是完成原始的if语句。没有任何反应。我该如何解决这个问题。

def clicked(self, event):
    if event.widget == self.B00:
        print("You can select B04 or B40")
        if event.widget == self.B04:
            self.userMoveLeft(4)
        elif event.widget == self.B40:
            self.userMoveUp(20)

    if event.widget == self.B04:
        if event.widget == self.B00:
            self.userMoveRight(0)
        elif event.widget == self.B44:
            self.userMoveUp(24)

这是我的实际行动左定义

def userMoveLeft(self, pos):
    # Is this a valid move?
    if self.board[pos] == " " or self.board[pos] == "X" or self.board[pos] == "O":
        # Record the players move...]
        self.board[pos - 4] = self.board[pos - 3]
        self.board[pos - 3] = self.board[pos - 2]
        self.board[pos - 2] = self.board[pos - 1]
        self.board[pos - 1] = self.board[pos]
        self.board[pos] = "X"
        # Then redraw the board!
        self.redrawBoard()

所以shoudl发生的是当用户点击按钮B00时他应该可以选择单击B04或B40,我觉得发生的是如果你点击B00然后点击B04它停止了我的if语句并转移到if语句在按钮B04上并启动if语句而不是将X放在B04上,就像它应该的那样。

如果你曾经玩过,这将是QUIXO的游戏。

我知道如果我在我的地方取出If语句,我称之为self.userMoveLeft,或者移动本身确实有效,所以我的问题是在中间定义标有*****

我只是想补充一下,我是编程的新手,如果我不完全理解,请原谅我

我也在想,当用户制作他们的第二个拣板时,能够保持按钮按下会很棒。好像你应该能够使event.widget == self.B00一个郁闷按钮,直到你选择self.B04进行移动然后B00不再被按下。

所有这些都是使用tkinter模块用Python制作的

感谢您的帮助。

修改

我想知道是否有类似的东西     def clicked(self,event,event2):         if event.widget == self.B00:             打印(&#34;您可以选择B04或B40&#34;)             如果event2.widget == self.B04:                 self.userMoveLeft(4)             elif event2.widget == self.B40:                 self.userMoveUp(20)

1 个答案:

答案 0 :(得分:1)

在此代码中

def clicked(self, event):
    if event.widget == self.B00:
        print("You can select B04 or B40")
        if event.widget == self.B04:
            self.userMoveLeft(4)
        elif event.widget == self.B40:
            self.userMoveUp(20)

执行print语句后,其他任何代码都不会被执行。 event.widget的值为self.B00,或者我们不会执行此代码。嵌套的if语句将不会被执行,因为它们需要event.widget来获得其他值。您显然认为当用户单击按钮4或按钮40时,event.widget的值将发生变化,但事实并非如此。会发生什么情况self.click将被称为另一次,event.widget的值不同。

执行self.click之类的回调时,它会运行完成。在完成之前,您无法处理其他事件。所以你对正在发生的事情的心智模型是不正确的。单击按钮0,self.click运行。现在,当您按下按钮4时,self.click再次运行。假设self.click是一个长时间运行的函数,并且在第一次调用self.click之前按下了按钮4。按下第二个按钮将被添加到事件队列中,并且在第一次调用self.click完成运行之前不会处理第二个按钮按下。

或许您要做的是在按下按钮0时禁用按钮4和按钮40的所有按钮。我不熟悉这个游戏,所以我不知道这是不是一个好主意。

编辑:要禁用按钮0,您可以使用

self.B000.configure(state=tk.DISABLED)

要再次启用它,请使用

self.B000.configure(state=tk.NORMAL)

我首先尝试的是让回调立即禁用所有按钮(编写一个名为disableButtons的函数或类似的东西),然后只启用你需要的按钮。禁用40个按钮应该是如此之快,你不会注意到它。当您禁用该按钮时,它将变灰或变暗,以便用户可以明白哪些按钮被允许按下。

如果游戏规则适应这种方法,我建议让dict显示在特定选择后允许哪些按钮。例如

allowed[self.B000] = [self.B004,self.B040] 

那么你的回调可以像

那样开始
def clicked(self, event):
    disableButtons()
    for button in allowed[event.widget]:
        button.configure(state = tk.NORMAL)