【发布时间】:2014-05-17 21:00:00
【问题描述】:
我正在尝试使用glib.timeout_add() 和glib.source_remove() 将单击事件与双击事件分开。这是我的做法:
class Exchange:
'''
some code
'''
def __init__(self):
self.timeoutID_1 = 0
self.timeoutID_2 = 0
self.startTime1 = 0.0
self.stopTime1 = 0.0
self.startTime2 = 0.0
self.stopTime2 = 0.0
'''
some code
'''
## THE DOUBLE CLICK SIGNAL - item-activated
iconView1.connect("item-activated", self.on_item_activated_1,upButton1, store1)
sw1.add(iconView1)
iconView2.connect("item-activated", self.on_item_activated_2,upButton2, store2)
sw2.add(iconView2)
## THE SINGLE CLICK SIGNAL - selection-changed
iconView1.connect("selection-changed", self.on_selection_changed_1, copyButton1, cutButton1, pasteButton1, deleteButton1)
iconView2.connect("selection-changed", self.on_selection_changed_2, copyButton2, cutButton2, pasteButton2, deleteButton2)
def on_selection_changed_1(self, iconView1, copyButton1, cutButton1, pasteButton1, deleteButton1) :
self.startTime1 = time.time()
self.timeoutID_1 = glib.timeout_add(2000, self.selectIcon_1, iconView1, copyButton1, cutButton1, pasteButton1, deleteButton1)
def on_selection_changed_2(self, iconView2, copyButton2, cutButton2, pasteButton2, deleteButton2) :
self.startTime2 = time.time()
self.timeoutID_2 = glib.timeout_add(2000, self.selectIcon_2, iconView2, copyButton2, cutButton2, pasteButton2, deleteButton2)
def selectIcon_1(self, iconView1, copyButton1, cutButton1, pasteButton1, deleteButton1) :
copyButton1.set_sensitive(True)
cutButton1.set_sensitive(True)
pasteButton1.set_sensitive(True)
deleteButton1.set_sensitive(True)
def selectIcon_2(self, iconView2, copyButton2, cutButton2, pasteButton2, deleteButton2) :
copyButton2.set_sensitive(True)
cutButton2.set_sensitive(True)
pasteButton2.set_sensitive(True)
deleteButton2.set_sensitive(True)
def on_item_activated_1(self, iconView1, item, upButton1, store1) :
self.stopTime1 = time.time()
if self.stopTime1 - self.startTime1 < 1.50 :
glib.source_remove(self.timeoutID_1)
'''
some code
'''
def on_item_activated_2(self, iconView2, item, upButton2, store2) :
self.stopTime2 = time.time()
if self.stopTime2 - self.startTime2 < 1.50 :
glib.source_remove(self.timeoutID_2)
'''
some code
'''
尽管 self.stopTime - self.startTime <1.50 是 True(表示有效的双击),但单击事件会执行一次,但每次单击仅执行一次,在 2 秒后。如何完全取消selectIcon 方法的执行以进行有效的双击?
更新
按照 mtwebster 的回答,我尝试使用 button_press_event。可悲的是,尽管我又回到了原点。
def on_button_press_event(self, widget, event) :
if event.button == 1 :
data = widget.get_path_at_pos(int(event.x), int(event.y))
if data :
if event.type == gtk.gdk._2BUTTON_PRESS :
print " double click "
elif event.type == gtk.gdk.BUTTON_PRESS :
print " single click "
输出 ::
vineet@vineet:~/Documents/Project$ python draft6.py
single click
single click
double click
增加了我的困境三个点击事件正在执行一次双击,两次单击和一次双击!有没有其他我可以使用的计时机制来代替glib.timeout_add(),这样我就不必处理重复调用废话的不确定性了?
【问题讨论】:
-
您为什么要自己处理所有
"button-press/release-event"信号?把逻辑弄对是很麻烦的。文档清楚地说明"item-activated"是双击激活的(如果"activate-on-single-click"属性设置为FALSE和其他一些foo)并且"selection-changes"通常是单击激活的(或箭头键乐趣)。你能详细说明你想要实现什么行为吗? -
@drahnr 我确实使用了这些方法,但是对于 iconView
selection-changed中的每一次单击都会触发。我正在构建一个带有剪切/复制/粘贴/删除实用程序的文件浏览器。因此,每次单击文件/文件夹都会选择剪切/复制等,每次双击文件夹都将帮助我查看该文件夹的内容 -
我仍然没有看到问题。究竟是什么阻止您使用带有回调的
"item-activated"打开/查看文件夹乐趣和使用"selection-changed"相应地突出您的选择?button-press/release-events根本不需要,您的事件是隐式分离的。我错过了什么吗? -
@drahnr 我的想法太混乱了,因此错过了显而易见的事情。使用
item-activated和selection-changed并成功了。请添加一个答案,我会给你赏金代表。
标签: python gtk pygtk glib double-click