Отключенная кнопка по-прежнему ловит щелчки во время длинных задач wxpython - PullRequest
0 голосов
/ 24 октября 2018

Отключенная кнопка по-прежнему ловит щелчки во время долгого задания.Во время длинных задач кнопка становится серой, но если вы щелкнете по ней во время длинной задачи, событие щелчка срабатывает после завершения длинной задачи.Например,

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

Кнопка отключается перед выполнением длинного цикла для , но если мы нажмем кнопку во время цикла for, она снова запустит цикл for, потому что вызывает Функция onClick снова после завершения цикла for.

Есть идеи, как отключить событие click?

Ответы [ 3 ]

0 голосов
/ 24 октября 2018

Хотя у меня есть сомнения по поводу того, следует ли вам кодировать ваше длинное работающее событие таким образом, вы можете достичь того, что хотите, используя Unbind при нажатии кнопки, выполнить долгосрочное задание, используя Yield, чтобы использоватьдо любого последующего нажатия кнопки, а затем в конце задания Bind снова до кнопки.т.е.

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()
0 голосов
/ 14 ноября 2018

На самом деле это проще, чем предполагал мой первый ответ.Нет никаких оснований для UnBind, достаточно просто использовать Yield перед повторным включением кнопки:

import wx
import time

class ButtonFrame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self,None,-1,"Disable Button Events")
        panel = wx.Panel(self, -1)
        self.btn = wx.Button(panel, -1, "Click Me", pos=(10,10), size=(80,30))
        self.btn.Bind(wx.EVT_BUTTON, self.onClick)
        self.Show()

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

if __name__ == "__main__":

    app = wx.App()
    ButtonFrame()
    app.MainLoop()
0 голосов
/ 24 октября 2018

Если честно, я не совсем понял, о чем вы спрашиваете.

Ваш код работает следующим образом:

  1. Когда вы нажимаете на кнопку, кнопка (т.е. self.btn) отключается
  2. Она останется отключенной и выполнитсяцикл for
  3. По завершении выполнения цикла for кнопка возвращается в рабочее состояние

Если вы хотите отключить кнопку, вы должны сделать это вне события onclick.Например:

self.btn.Disable()  # This will grey out the button, you can't click it, so the following onClick function wouldn't be triggered
def onClick(self, evt):
    # do something

Если вы хотите использовать кнопку для запуска выполнения задачи и отключить кнопку, которая запускает задачу, когда задача находится в середине выполнения, лучше всего использоватьмногопотоковый.Вы можете взглянуть на следующие две ссылки для получения дополнительной информации:

http://www.blog.pythonlibrary.org/2010/05/22/wxpython-and-threads/ https://wiki.wxpython.org/LongRunningTasks

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...