我使用GtkHScale(这是一个滑块)在媒体播放器中执行搜索。我连接了" value_changed"将小部件的信号发送回回调,以便用户可以进行搜索。我还设置了一个计时器,它将每250ms更新一次小部件,以便它显示当前位置。不幸的是,GTK触发了" value_changed"无论滑块是由用户点击还是由计时器更新,都会发出信号。我试着在"点击"信号,并且回调被解雇了,但它始终寻求开始
答案 0 :(得分:0)
您可以通过连接按钮事件和按钮释放事件信号来跟踪用户是否正在移动滑块。当用户按下鼠标按钮时,您希望阻止来自播放器的更新,以便在用户尝试搜索时不移动滑块。在按钮释放处理程序中,您可以取消阻止更新。
答案 1 :(得分:0)
一种技术是使用g_signal_handler_block / unblock [1]调用来围绕对gtk_range_set_value()的调用以进行回放更新。这允许更新滑块的值和UI,而不会触发特定值更改处理程序。
显示on_value_changed的Python GTK + 3示例仅通过交互式清理调用:
from gi.repository import Gtk, GLib
def on_value_changed(hscale):
print('value-changed: %s' % hscale.get_value())
def on_timeout(hscale, handler_id):
# Block value-changed handler during timed playback updates.
with hscale.handler_block(handler_id):
hscale.set_value(hscale.get_value() + 1)
return True
hscale = Gtk.HScale()
hscale.set_range(0, 100)
handler_id = hscale.connect('value-changed', on_value_changed)
window = Gtk.Window()
window.set_size_request(500, 50)
window.add(hscale)
window.connect('destroy', Gtk.main_quit)
window.show_all()
GLib.timeout_add(100, on_timeout, hscale, handler_id)
Gtk.main()
[1] https://developer.gnome.org/gobject/stable/gobject-Signals.html#g-signal-handler-block