当另一个函数运行时,禁止单击事件在窗口小部件上排队

时间:2018-10-02 14:57:46

标签: python tkinter

我有一个功能(A),该功能绑定到Canvas上的click事件。在某个时候,函数A调用另一个函数(B)。画布内容可能会在函数B中更改,因此我希望它在运行时忽略画布单击事件。我试过设置一个布尔变量,该布尔变量在调用函数B之前将函数A调用为False时进行检查,然后在完成函数B时将其重置为True,但是该事件仍会因新内容的鼠标坐标错误而排队。我尝试将画布单击事件重新绑定到仅返回“ break”的函数(C),然后调用函数B,然后将画布单击事件重新绑定回函数A。对于新内容,鼠标坐标仍然很差。我试过将画布状态设置为“禁用”,然后调用函数B,然后将状态设置为“正常”。我试过从函数A,函数B和两者返回“ break”。我得到相同的结果,它仍然在新内容的鼠标坐标不好的情况下排队。有什么建议吗?

我在当前状态下用于测试选项的代码:

import time
from tkinter import *

class test_form(object):
    def __init__(self, master):
        self.master = master
        self._CreateGUI()

    def _CreateGUI(self):
        geom = "200x175+0+0"
        self.master.geometry(geom)
        self.xx=Canvas(bg='#ff0000',width=100,height=75)
        self.xx.bind('<ButtonRelease>',self.test_button)
        self.xx.pack()

    def waste_time(self):
        print('time wasted')
        time.sleep(10)
        return "break"

    def test_button(self,event=None):
        self.waste_time()
        return "break"

def start_gui():
    root = Tk()
    form_load = test_form(root)
    root.mainloop()

if __name__ == "__main__":
    start_gui()

1 个答案:

答案 0 :(得分:0)

以下方法似乎可以解决您的问题。可能与您已经尝试过的类似,但有一个after()插入:

class test_form(object):
    def __init__(self, master):
        self.master = master
        self._CreateGUI()

    def _CreateGUI(self):
        geom = "200x175+0+0"
        self.master.geometry(geom)
        self.xx = Canvas(bg='#ff0000', width=100, height=75)
        self.xx.pack()

        self.notice()

    def waste_time(self):
        print('time wasted')
        time.sleep(10)

    def notice(self):
        self.xx.bind('<ButtonRelease>', self.test_button)

    def ignore(self):
        self.xx.bind('<ButtonRelease>', lambda event: "break")

    def test_button(self, event):
        self.ignore()
        self.waste_time()
        self.master.after(500, self.notice)