点击并按住PyGTK?

时间:2016-05-21 01:52:29

标签: touch pygtk

有没有办法在PyGTK中检测点击并保持事件?我处于触摸环境中,如果按住按钮超过一秒左右,我想从按钮弹出一个上下文菜单,因为我无法进行右键单击或按住Ctrl键单击。

如果没有简单的方法,我想我可以让鼠标按下事件启动GTK超时,激活菜单,并在鼠标释放处理程序中取消它。但是如果超时触发,我将如何取消鼠标按下以便最终鼠标释放不会触发按钮点击事件?

2 个答案:

答案 0 :(得分:2)

bohrax:经过尝试,并在它上面殴打了一段时间后,它变成了一些非常干净的东西。也许别人可以让它变得更干净。

class HoldButton(gtk.Button):

    __gsignals__ = { 'held' : (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, ()) }

    def __init__(self, label=None, stock=None, use_underline=True):
        gtk.Button.__init__(self, label, stock, use_underline)
        self.connect('pressed', HoldButton.h_pressed)
        self.connect('clicked', HoldButton.h_clicked)
        self.timeout_id = None

    def h_clicked(self):
        if self.timeout_id:
            gobject.source_remove(self.timeout_id)
            self.timeout_id = None
        else:
            self.stop_emission('clicked')

    def h_pressed(self):
        self.timeout_id = gobject.timeout_add(750, HoldButton.h_timeout, self)

    def h_timeout(self):
        self.timeout_id = None
        self.emit('held')
        return False

这会在"按下"处理程序。如果它仍然在"单击"处理程序,超时被取消,否则"点击"信号以stop_emission终止。然后我必须弄清楚如何定义一个新的信号" hold",它在超时处理程序中发出。

答案 1 :(得分:0)

我认为最简单,最便携的方法是将您的方法与状态标志一起使用,以通知“长按”是否正在进行中。您可以使用“已释放”而不是连接到按钮的“已点击”信号,并检查该处理程序中的标志值。