2014-04-04 83 views
0

我正在使用IconView在python上创建基于gtk(pygtk)的GUI文件浏览器。它有两个信号--,当通过单击选择图像时会触发这两个信号,并且在执行双击时触发该信号。我需要我的程序中的信号selection-changed选择要剪切/复制的文件夹,并且需要item-activated来导航子文件夹和文件。如何在实际尝试触发双击事件时阻止双击单击事件?

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

因此,这个问题。

回答

1

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

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

实现提示:使用一个变量,以便在最后一次双击发生时保存,并使用time.time()作为最后一次单击的变量。 如果双击和单击非常接近,请不要执行单击单击代码。 由于使用超时,双击后单击始终执行。

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()