2012-01-30 12 views
6

मैं एक संवाद विंडो चाहता हूं जहां कुछ बटन संवाद बंद करते हैं और अन्य नहीं करते हैं। डायलॉग पर emit_stop_by_name('response') पर कॉल करने के लिए Gtk.Dialog से response सिग्नल का उपयोग करके मैं ऐसा करता हूं। (अगर कोई ऐसा करने का बेहतर तरीका जानता है, तो वह इस पूरे प्रश्न को छोड़ सकता है।)स्वचालित रूप से सिग्नल कनेक्ट करने के लिए GtkBuilder का उपयोग करते समय संवाद ब्रेक होता है, लेकिन सिग्नल मैन्युअल रूप से कनेक्ट करते समय काम करता है

जब मैंने पीईजीटीके का उपयोग किया तो यह काम करता था। मैं अब PyGObject पर जा रहा हूं .. और ऐसा लगता है कि यह तकनीक केवल काम करेगी यदि मैं मैन्युअल रूप से Gtk.Builder.connect_signals() का उपयोग करने के बजाय प्रतिक्रिया संकेत से कनेक्ट करता हूं।

लेकिन इसके लिए मेरा शब्द न लें। यहां मेरी समस्या का एक न्यूनतम उदाहरण दिया गया है:

from gi.repository import Gtk 

xml = """<interface> 
    <object class="GtkDialog" id="dialog1"> 
    <signal name="response" handler="on_response"/> 
    <child internal-child="vbox"> 
     <object class="GtkBox" id="dialog-vbox1"> 
     <child internal-child="action_area"> 
      <object class="GtkButtonBox" id="dialog-action_area1"> 
      <child> 
       <object class="GtkButton" id="button1"> 
       <property name="label">Don't Close Dialog</property> 
       <property name="visible">True</property> 
       </object> 
      </child> 
      <child> 
       <object class="GtkButton" id="button2"> 
       <property name="label">Close Dialog</property> 
       <property name="visible">True</property> 
       </object> 
      </child> 
      </object> 
     </child> 
     </object> 
    </child> 
    <action-widgets> 
     <action-widget response="0">button1</action-widget> 
     <action-widget response="-6">button2</action-widget> 
    </action-widgets> 
    </object> 
</interface> 
""" 

def on_button_clicked(widget): 
    d = DummyDialog() 
    d.dialog1.run() 
    d.dialog1.destroy() 

class DummyDialog: 
    def __init__(self): 
     self.builder = Gtk.Builder() 
     self.builder.add_from_string(xml) 
     self.dialog1 = self.builder.get_object('dialog1') 
     self.builder.connect_signals(self) 

    def on_response(self, widget, response, data=None): 
     print 'response:', response 
     if response >= 0: 
      widget.emit_stop_by_name('response') 

w = Gtk.Window() 
w.connect('destroy', Gtk.main_quit) 
b = Gtk.Button('Open Dialog') 
b.connect('clicked', on_button_clicked) 
w.add(b) 

w.show_all() 

Gtk.main() 

जब आप इसे चलाते हैं, तो आपको एक बटन के साथ एक विंडो मिलती है। जब आप उस बटन पर क्लिक करते हैं, तो एक संवाद दो बटनों के साथ पॉप-अप होता है, जिसे "बंद न करें संवाद" लेबल किया जाता है और दूसरा "बंद संवाद" लेबल किया जाता है। उपरोक्त कोड चलाते समय, दोनों बटन संवाद बंद कर देंगे।

लेकिन अगर आप मैन्युअल रूप से

 self.builder.connect_signals(self) 

की जगह संकेत को जोड़ने के लिए

 self.dialog1.connect('response', self.on_response) 

तो साथ Gtk.Builder.connect_signals() का उपयोग करने से बदल यह शुरू होता है काम कर तैयार किया गया है के रूप में ("नहीं बंद संवाद करें" बटन नहीं करता है संवाद बंद नहीं करें)।

लेकिन क्या इन दो पंक्तियों को इस संदर्भ में वास्तव में समान रूप से समान नहीं होना चाहिए? क्या यह पता लगाने का कोई तरीका है कि दोनों परिदृश्यों के बीच क्या अंतर है?

मैं बता सकता हूं कि सिग्नल अभी भी दोनों परिस्थितियों में जुड़े हुए हैं क्योंकि पाठ अभी भी DummyDialog.on_response से सीएलआई को मुद्रित है। लेकिन ऐसा लगता है कि जब मैं GtkBuilder का उपयोग करता हूं तो widget.emit_stop_by_name('response') भाग काम बंद कर देता है।

इससे भी अधिक हैरान है कि यदि आप इस सटीक कोड लेने के लिए और PyGTK (परिवर्तन import gtk as Gtk करने के लिए from gi.repository import Gtk) पर चला, तो इसे सही ढंग से दोनों परिदृश्यों (self.builder.connect_signals(self) या self.dialog1.connect('response', self.on_response) का उपयोग) में काम करता है।

उत्तर

2

मैं इसे थोड़ा अलग कर दूंगा। बटन में dialog1.destroy() कॉलबैक क्लिक किया निकालें और करने के लिए on_response कॉलबैक बदलने के लिए:

def on_response(self, widget, response, data=None): 
     print 'response:', response 
     if response < 0: 
      self.dialog1.destroy() 
+0

धन्यवाद, कि बस मैन्युअल रूप से जोड़ने के संकेत है कि काम नहीं करते है, जो मेरे पिछले समाधान किया गया था की तुलना में अधिक सुरुचिपूर्ण समाधान की तरह लगता है। लेकिन मैं अभी भी परेशान हूं कि मेरा मूल कोड क्यों काम नहीं करता है। – dumbmatter

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

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