2015-11-27 12 views
5

Próbuję przeprowadzić migrację odtwarzacza audio zapisanego w pythonie do GTK3 +. W GTK2 użyłem progress_bar.add_event (... pointer_motion_notify | button_press) (pełny kod poniżej) i ustaw procedurę obsługi sygnału dla button_press i pointer_motion_notify. W GTK3 wygląda na to, że ProgressBar() nie emituje tych sygnałów.Gtk3 ProgressBar(): nie można odbierać zdarzeń w języku Python

Zaimplementowałem obejście za pomocą nakładki() i funkcji DrawingArea(), która umożliwia funkcji DrawingArea wysyłanie sygnałów, ale nie musi ... Czy to błąd? czy robię to źle?

Kod:

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

Odpowiedz

4

Jego chyba lepiej użyć eventbox - dodać widget do eventbox i podłączyć do eventbox sygnalizuje siebie.

Zatem:

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

Więcej informacji o Gtk.Eventbox można znaleźć here.

+1

Thankyou - tak, to wydaje się lepszym rozwiązaniem (i prawdopodobnie to, co EventBox zaprojektowano dla :-) – simonltwick

+1

@simonltwick - thanks. pamiętaj o każdej witrynie stosu zmian, nie zapomnij kliknąć przycisku zaznaczenia obok dowolnej odpowiedzi, którą chcesz i chcesz zaakceptować. Kiedy masz wystarczającą liczbę punktów rep kliknij przycisk w górę lub w dół, aby powiedzieć, czy jesteś szczęśliwy/niezadowolony z jakiejkolwiek odpowiedzi. – fossfreedom

Powiązane problemy