如何在实际尝试触发双击事件时防止单击事件的双重执行?

时间:2014-04-04 03:48:42

标签: python signals pygtk

我正在使用IconView在python上创建基于gtk(pygtk)的GUI文件浏览器。它有两个信号 - selection-changed在单击选择图像时触发,item-activated在执行双击时触发。我需要程序中的两个信号selection-changed来选择要剪切/复制的文件夹,item-activated来导航子文件夹和文件。

但是,双击会生成两个selection-changed信号和一个item-activated信号。我只需要生成item-activated信号。

因此问题。

2 个答案:

答案 0 :(得分:1)

第二次单击和双击事件应该同时到达。

您可以使用glib.timeout_add(interval, callback, ...)在一毫秒后执行所有单击(或增加它)。 如果在一段时间内发生双击,则不执行单击事件。

实施提示:使用变量,以便在上次双击时保存,使用time.time()进行最后一次点击的变量。 如果双击和单击非常接近,请不要执行单击代码。 由于使用了超时,单击总是在双击后执行。

答案 1 :(得分:0)

为什么不跟踪选择哪个项目?忽略选择 - 在第二次单击时更改,因为选择不会更改。以下是经过修改以处理此案例的pytk常见问题解答的示例...

import gtk
import gtk.gdk


current_path = []
current_path.append(None)

def on_selection_changed(iconview, current_path):
    if iconview.get_selected_items():
        if cmp(current_path[0], iconview.get_selected_items()[0]):
            print "selection-changed"
        current_path[0] = iconview.get_selected_items()[0]

def on_item_activated(iconview, path):
    print "item-activated"

# First create an iconview
view = gtk.IconView()
view.connect("selection-changed", on_selection_changed, current_path)
view.connect("item-activated", on_item_activated)

# Create a store for our iconview and fill it with stock icons
store = gtk.ListStore(str, gtk.gdk.Pixbuf)
for attr in dir(gtk):
    if attr.startswith('STOCK_'):
        stock_id = getattr(gtk, attr)
        pixbuf = view.render_icon(stock_id,
            size=gtk.ICON_SIZE_BUTTON, detail=None)
        if pixbuf:
            store.append(['gtk.%s' % attr, pixbuf])

# Connect our iconview with our store
view.set_model(store)
# Map store text and pixbuf columns to iconview
view.set_text_column(0)
view.set_pixbuf_column(1)

# Pack our iconview into a scrolled window
swin = gtk.ScrolledWindow()
swin.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
swin.add_with_viewport(view)
swin.show_all()

# pack the scrolled window into a simple dialog and run it
dialog = gtk.Dialog('IconView Demo')
close = dialog.add_button(gtk.STOCK_CLOSE, gtk.RESPONSE_NONE)
dialog.set_default_size(400,400)
dialog.vbox.pack_start(swin)
dialog.run()
相关问题