【问题标题】:Click and hold in PyGTK?在 PyGTK 中单击并按住?
【发布时间】:2023-08-30 17:30:01
【问题描述】:

有什么方法可以检测 PyGTK 中的单击并按住事件?我处于触摸环境中,如果我按住按钮超过一秒左右,我想从按钮弹出上下文菜单,因为我无法右键单击或 ctrl-单击。

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

【问题讨论】:

  • 解决方案是否需要独立于操作系统?如果没有,您使用的是哪个操作系统?

标签: touch pygtk


【解决方案1】:

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

这会在“按下”处理程序中启动超时。如果它在“clicked”处理程序中仍处于挂起状态,则取消超时,否则“clicked”信号以stop_emission 终止。然后我必须弄清楚如何定义一个新信号“held”,它在超时处理程序中发出。

【讨论】:

  • 我喜欢你设法封装了行为。之前不知道 stop_emission 函数。
  • 嘿,我想在我的触摸屏(Debian)中测试整个脚本。你有 github 中可用的脚本吗?
  • GTK 人员已弃用其中几个函数:self.stop_emission('clicked') 应该变为 self.stop_emission_by_name('clicked')。你应该(如果你还没有)像from gi.repository import GLib 一样导入GLib 并使用具有相同参数的GLib.timeout_add。没什么大不了的,只是想在功能被删除后我会把这个注释放在这里,这样人们就知道该怎么做了。
【解决方案2】:

我认为最简单和最便携的方法是将您的方法与状态标志一起使用,该标志通知是否正在进行“长按”。除了连接到按钮的 'clicked' 信号,您还可以使用 'released' 并检查该处理程序中标志的值。

【讨论】:

  • 天哪。这实际上在 Windows 的触摸屏上不起作用。当您触摸按钮时,您不会收到“按下”事件。相反,当你触摸和释放时,你会快速连续地“按下”、“点击”和“释放”。如果你按住不放,操作系统会弹出一个框,表示释放会弹出一个上下文菜单,当你释放时,PyGTK 不会发出这三个事件。
最近更新 更多