首页 > 解决方案 > 在长任务wxpython期间,禁用的按钮仍然捕获点击

问题描述

禁用按钮在长时间任务期间仍会捕获点击。在长任务期间,该按钮呈灰色显示,但如果您在长任务期间单击它,则在长任务完成后会触发单击事件。例如

def onClick(self, evt):
    self.btn.Disable()
    for i in range (1000):
        print i
    self.btn.Enable()

Button 在执行长for循环之前会禁用自身,但是如果我们在 for 循环期间单击按钮,它会再次启动 for 循环,因为它会在 for 循环结束后再次调用onClick函数。

知道如何禁用点击事件吗?

标签: pythonwxpython

解决方案


尽管我怀疑您是否应该以这种方式编写长时间运行的事件,但您可以通过Unbind单击按钮来实现您想要的,执行长时间运行的任务,Yield用完任何后续按钮单击,然后在任务结束Bind再按一次按钮。IE

import wx
import time

class ButtonFrame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self,None)
        self.btn = wx.Button(self, -1, "Click Me")
        self.btn.Bind(wx.EVT_BUTTON, self.onClick)
        self.Centre()
        self.Show()

    def onClick(self, event):
        self.btn.Unbind(wx.EVT_BUTTON)
        for i in range (10):
            time.sleep(1)
            print( i )
        wx.GetApp().Yield() # Yielding allows button events to be used up
        self.btn.Bind(wx.EVT_BUTTON, self.onClick)
        print ("Accepting clicks again")

if __name__ == "__main__":

    app = wx.App()
    ButtonFrame()
    app.MainLoop()

推荐阅读