2015-11-27 8 views
5

में घटनाएं प्राप्त करने में असमर्थ मैं जीटीके 3 + में पाइथन में लिखे गए एक ऑडियो प्लेयर को माइग्रेट करने का प्रयास कर रहा हूं। जीटीके 2 में मैंने progress_bar.add_event (... pointer_motion_notify | button_press) (नीचे पूरा कोड) का उपयोग किया, और बटन_प्रेस और पॉइंटर_मोशन_नोटिफ़ाई के लिए सिग्नल हैंडलर सेट किया। जीटीके 3 में, ऐसा प्रतीत होता है कि प्रोग्रेसबार() इन संकेतों को उत्सर्जित नहीं करता है।जीटीके 3 प्रोग्रेसबार(): पायथन

मैंने ओवरले() और ड्रॉइंग एरिया() का उपयोग करके एक वर्कअराउंड लागू किया है जो ड्रॉइंगएरिया को संकेतों को उत्सर्जित करने की अनुमति देता है, लेकिन इसकी आवश्यकता नहीं है ... क्या यह एक बग है? या मैं गलत कर रहा हूँ?

कोड:

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

इसकी शायद बेहतर एक eventbox उपयोग करने के लिए - आप eventbox विजेट जोड़ने और कनेक्ट eventbox खुद को संकेत करने के लिए।

इस प्रकार:

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

धन्यवाद - हाँ, यह एक बेहतर समाधान प्रतीत होता है (और शायद इवेंटबॉक्स को किसके लिए डिज़ाइन किया गया था :-) – simonltwick

+1

@ सिमोनल्टविक - धन्यवाद। किसी भी स्टैकएक्सचेंज साइट पर याद रखें, अपने पसंदीदा उत्तर के आगे टिक बटन पर क्लिक करना न भूलें और स्वीकार करना चाहते हैं। जब आपके पास पर्याप्त प्रतिनिधि बिंदु होते हैं तो यह कहने के लिए ऊपर या नीचे बटन क्लिक करें कि क्या आप किसी भी उत्तर से खुश/नाखुश हैं। – fossfreedom

संबंधित मुद्दे