2016-05-21 77 views
2

有什麼方法可以檢測PyGTK中的點擊和保持事件嗎?我處於觸摸環境中,如果按住按鈕長於一秒左右的時間,我想從按鈕彈出一個上下文菜單,因爲我無法進行右鍵單擊或按住Ctrl單擊。點擊並保持在PyGTK?

如果沒有簡單的方法,我想我可以讓鼠標按下事件啓動GTK超時,它將激活菜單,並在鼠標釋放處理程序中取消它。但是,如果超時激活,我將如何取消鼠標按下,以便最終的鼠標釋放不會觸發按鈕單擊事件?

+0

解決方案是否需要與操作系統無關?如果不是,你在哪個操作系統上? – bohrax

回答

0

我認爲最簡單和最便攜的方式是將您的方法與狀態標誌一起使用,以通知是否正在進行「長按」操作。不用連接到按鈕的「單擊」信號,您可以使用「釋放」,並檢查該處理程序中標誌的值。

+0

哦,臭蟲。這實際上並不適用於Windows中的觸摸屏。當您觸摸按鈕時,您不會收到「按下」事件。相反,當你觸摸並釋放時,你會快速連續「按下」,「點擊」和「釋放」。如果你按住,操作系統會彈出一個框,表示釋放會彈出一個上下文菜單,當你釋放時,PyGTK不會發出這三個事件。 –

2

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終止。然後我不得不弄清楚如何定義一個新的信號,「持有」,它在超時處理程序中發出。

+0

我喜歡你設法封裝的行爲。之前沒有意識到stop_emission功能。 – bohrax

+0

嘿,我想測試整個腳本在我的觸摸屏(Debian)。你有github中的腳本嗎? –