3

4つのボタンを備えたシンプルなGUIが欲しいです。ボタンをクリックするだけで、機能Aが実行され、ボタンを短く押す(eg1sec)場合は機能Bが実行され、最後に長押し(> 2s)機能Cが実行されます。カウンターを想像してみてください。ボタンをクリックすると、0にリセットされます。ボタンを短く押すと、カウンターは1ずつ増加します(例:t = 1秒)。ボタンを長押しすると、ボタンが離されるまでカウンターが10ずつ増加します。

誰かがアイデアを持っていますか。私はこれを2番目のスレッドで達成しようとしていましたが、スレッドを開始できるようにスレッドを停止する可能性は見つかりませんでした

4

2 に答える 2

7

QAbstractButtonを継承するウィジェットを使用する場合、これはPyQtで簡単に実行できます。タイマーや個別のスレッドは必要ありません。組み込みの自動リピート機能を使用するだけで、現在の状態を記録できます。

簡単なデモは次のとおりです。

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_())
于 2012-12-13T01:27:28.550 に答える
2

wxPythonでは、このようにします...ただし、GUIライブラリに合わせて調整する必要がある場合があります...

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)

私は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()
于 2012-12-12T17:24:07.570 に答える