有什麼方法可以檢測PyGTK中的點擊和保持事件嗎?我處於觸摸環境中,如果按住按鈕長於一秒左右的時間,我想從按鈕彈出一個上下文菜單,因爲我無法進行右鍵單擊或按住Ctrl單擊。點擊並保持在PyGTK?
如果沒有簡單的方法,我想我可以讓鼠標按下事件啓動GTK超時,它將激活菜單,並在鼠標釋放處理程序中取消它。但是,如果超時激活,我將如何取消鼠標按下,以便最終的鼠標釋放不會觸發按鈕單擊事件?
有什麼方法可以檢測PyGTK中的點擊和保持事件嗎?我處於觸摸環境中,如果按住按鈕長於一秒左右的時間,我想從按鈕彈出一個上下文菜單,因爲我無法進行右鍵單擊或按住Ctrl單擊。點擊並保持在PyGTK?
如果沒有簡單的方法,我想我可以讓鼠標按下事件啓動GTK超時,它將激活菜單,並在鼠標釋放處理程序中取消它。但是,如果超時激活,我將如何取消鼠標按下,以便最終的鼠標釋放不會觸發按鈕單擊事件?
我認爲最簡單和最便攜的方式是將您的方法與狀態標誌一起使用,以通知是否正在進行「長按」操作。不用連接到按鈕的「單擊」信號,您可以使用「釋放」,並檢查該處理程序中標誌的值。
哦,臭蟲。這實際上並不適用於Windows中的觸摸屏。當您觸摸按鈕時,您不會收到「按下」事件。相反,當你觸摸並釋放時,你會快速連續「按下」,「點擊」和「釋放」。如果你按住,操作系統會彈出一個框,表示釋放會彈出一個上下文菜單,當你釋放時,PyGTK不會發出這三個事件。 –
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
這會在「按下」處理程序中啓動超時。如果它仍處於「點擊」處理程序中,則超時被取消,否則「已點擊」信號將以stop_emission
終止。然後我不得不弄清楚如何定義一個新的信號,「持有」,它在超時處理程序中發出。
我喜歡你設法封裝的行爲。之前沒有意識到stop_emission功能。 – bohrax
嘿,我想測試整個腳本在我的觸摸屏(Debian)。你有github中的腳本嗎? –
解決方案是否需要與操作系統無關?如果不是,你在哪個操作系統上? – bohrax