2015-11-27 27 views
5

我正在嘗試將用python編寫的音頻播放器遷移到GTK3 +。在GTK2中,我使用了progress_bar.add_event(... pointer_motion_notify | button_press)(下面的完整代碼),併爲button_press和pointer_motion_notify設置了一個信號處理程序。在GTK3中,似乎ProgressBar()不會發出這些信號。Gtk3 ProgressBar():無法在Python中接收事件

我已經實現了使用Overlay()和DrawingArea()的解決方法,它允許DrawingArea發出信號,但不應該... 這是一個錯誤?還是我做錯了?

代碼:

import gi 
gi.require_version("Gtk","3.0") 
from gi.repository import Gtk, Gdk, GObject 

class MainWindow(Gtk.Window): 
    def __init__(self): 
     super(MainWindow, self).__init__(title='ProgressBar Event Test') 
     self.progressbar = Gtk.ProgressBar() 
     self.add(self.progressbar) 
     self.progressbar.set_events(Gdk.EventMask.BUTTON_PRESS_MASK 
            | Gdk.EventMask.POINTER_MOTION_MASK) 
     self.progressbar.connect("button-press-event", self.on_event, 'button-press') 
     self.progressbar.connect("motion-notify-event", self.on_event, 'motion-notify') 
     self.connect("delete-event", Gtk.main_quit) 
     self.current_progress = 0.0 
     GObject.timeout_add(200,self.update_progress) 
     self.show_all() 

    def on_event(self, widget, event, data=None): 
     print "on_event called for %s signal"%data 
     return False 

    def update_progress(self): 
     self.progressbar.set_fraction(self.current_progress) 
     self.current_progress += 0.01 
     return self.current_progress <= 1 # False cancels timeout 

def main(): 
    w = MainWindow() 
    Gtk.main() 

if __name__ == '__main__': 
    main() 

回答

4

它可能是更好的使用事件盒 - 你的小部件添加到事件盒並連接到事件盒信號本身。

這樣:

有關Gtk.Eventbox
import gi 
gi.require_version("Gtk","3.0") 
from gi.repository import Gtk, Gdk, GObject 

class MainWindow(Gtk.Window): 
    def __init__(self): 
     super(MainWindow, self).__init__(title='ProgressBar Event Test') 
     eventbox = Gtk.EventBox() 
     self.progressbar = Gtk.ProgressBar() 
     eventbox.add(self.progressbar) 
     self.add(eventbox) 
     eventbox.set_events(Gdk.EventMask.BUTTON_PRESS_MASK 
            | Gdk.EventMask.POINTER_MOTION_MASK) 
     eventbox.connect("button-press-event", self.on_event, 'button-press') 
     eventbox.connect("motion-notify-event", self.on_event, 'motion-notify') 
     self.connect("delete-event", Gtk.main_quit) 
     self.current_progress = 0.0 
     GObject.timeout_add(200,self.update_progress) 
     self.show_all() 

    def on_event(self, widget, event, data=None): 
     print "on_event called for %s signal"%data 
     return False 

    def update_progress(self): 
     self.progressbar.set_fraction(self.current_progress) 
     self.current_progress += 0.01 
     return self.current_progress <= 1 # False cancels timeout 

def main(): 
    w = MainWindow() 
    Gtk.main() 

if __name__ == '__main__': 
    main() 

更多信息,可以發現here

+1

Thankyou - 是的,這似乎確實是一個更好的解決方案(可能是什麼EventBox的設計:-) – simonltwick

+1

@simonltwick - 謝謝。請記住在任何stackexchange網站上,不要忘記點擊您喜歡的任何答案旁邊的勾號按鈕,並希望接受。當你有足夠的代表點擊向上或向下按鈕說,如果你對任何答案感到高興/不滿意。 – fossfreedom