Python: как различать длинную, короткую кнопку нажмите и нажмите

Я хочу иметь простой графический интерфейс с 4 кнопками. Если вы просто нажмете на кнопку, должна быть выполнена функция A, для короткой кнопки нажмите (eg1sec) функцию B, которая должна быть выполнена и, наконец, длинное нажатие (например,> 2s) должно выполняться функция C. Представьте счетчик. Если вы нажмете кнопку, она будет сброшена на 0. Если вы коротко нажмите кнопку, счетчик будет увеличен на 1, например, t = 1сек. Если вы долго нажимаете кнопку, счетчик будет увеличен на 10 до тех пор, пока кнопка не будет отпущена.

У кого-то есть идея. Я пытался это сделать со вторым потоком, но я не нашел возможности остановить поток, как вы можете его запустить

Это легко сделать в PyQt, если вы используете виджет, который наследует QAbstractButton. Нет необходимости в каких-либо таймерах или отдельных потоках. Просто используйте встроенные функции автоматического повтора и сохраните запись текущего состояния.

Вот простая демонстрация:

from PyQt4 import QtGui, QtCore class Button(QtGui.QPushButton): def __init__(self, *args, **kwargs): QtGui.QPushButton.__init__(self, *args, **kwargs) self.setAutoRepeat(True) self.setAutoRepeatDelay(1000) self.setAutoRepeatInterval(1000) self.clicked.connect(self.handleClicked) self._state = 0 def handleClicked(self): if self.isDown(): if self._state == 0: self._state = 1 self.setAutoRepeatInterval(50) print 'press' else: print 'repeat' elif self._state == 1: self._state = 0 self.setAutoRepeatInterval(1000) print 'release' else: print 'click' if __name__ == '__main__': import sys app = QtGui.QApplication(sys.argv) button = Button('Test Button') button.show() sys.exit(app.exec_()) 

в wxPython я бы сделал это вот так … однако вам может понадобиться настроить его для вашей библиотеки графического интерфейса …

 start_time = None def onLeftDown(e): global running running = True ct =0 while running: ct += 1 do_something(ct) def onLeftUp(e): print "You Pressed For %s Seconds!"%(time.time()-start_time) my_btn = wx.Button(parent,-1,"Click Me!") my_btn.Bind(wx.EVT_LEFT_DOWN,onLeftDown) my_btn.Bind(wx.EVT_LEFT_UP,onLeftUp) 

Im не очень familliar с QT, но, возможно, вы можете изменить этот код wx, чтобы делать то, что вы хотите …

 import wx ct = 0 def counting(): global running global ct if running: ct +=1 print ct wx.CallLater(1,counting) else: print "OK DONE COUNTING AT:",ct def onLeftDown(evt): global running running = True counting() def onLeftUp(evt): print "STOP NOW!!" global running running = False a = wx.App(redirect=False) f = wx.Frame(None,-1,"asdasd") b = wx.Button(f,-1,"Click Me") b.Bind(wx.EVT_LEFT_DOWN,onLeftDown) b.Bind(wx.EVT_LEFT_UP,onLeftUp) f.Show() a.MainLoop()