2010-12-04 7 views
1

私はPyGTKに精通していません。次のコードを参照してください。次のようにすることは可能ですか?PyGTKでボタンを押した後にメニューを更新するにはどうすればよいですか?

  1. "generate"と "view"という2つのボタンがあります。

のボタンは、「ビュー」ボタンを押してAを示すメニューがポップアップ表示されます変数AとB

  • のためのランダムな値を生成します「を生成」とB.
  • 次のコードに問題があることです「表示」メニューにはAとBが表示されますが、ユーザーが「生成」ボタンを押してもメニューは更新されません。

    私はPython 2.6.6でコードを実行しました。

    コード(書式設定、スタイル、PyGTKの規則など)を改善できる方法を提案してください。前もって感謝します。

    """Generate values for two variables A and B.""" 
    # ------------------------------------------------------------------------------ 
    # Winston C. Yang 
    # Created 2010-12-04 
    # ------------------------------------------------------------------------------ 
    # Python modules. Be alphabetical. 
    import random 
    # ------------------------------------------------------------------------------ 
    # Other Python modules. Be alphabetical. 
    import gtk 
    import pygtk 
    pygtk.require("2.0") 
    # ------------------------------------------------------------------------------ 
    class Generator: 
    
        """Generate values for two variables A and B.""" 
    
        def __init__(self): 
    
         # Create a dictionary in which a key is a variable name and a 
         # (dictionary) value is the variable value. 
         self.d_variable_value = {} 
         # ---------------------------------------------------------------------- 
         window = gtk.Window() 
         window.set_title("Generate") 
         window.connect("destroy", self.quit_event) 
         # ---------------------------------------------------------------------- 
         # Create a vertical box with two buttons. 
         vbox = gtk.VBox() 
    
         # Create a button to generate values for A and B. 
         b = gtk.Button("Generate A and B") 
         vbox.pack_start(b) 
         b.connect("clicked", self.generate_variable_values) 
    
         # Create a button to view A and B. 
         b = gtk.Button("View A and B") 
         vbox.pack_start(b) 
         b.connect_object("event", self.button_press, self.create_menu()) 
         # ---------------------------------------------------------------------- 
         window.add(vbox) 
         window.show_all() 
        # -------------------------------------------------------------------------- 
        def quit_event(self, widget=None, event=None): 
         """Quit.""" 
         gtk.main_quit() 
        # -------------------------------------------------------------------------- 
        def generate_variable_values(self, widget=None): 
         """Generate values for A and B.""" 
         self.d_variable_value = { 
          "A" : random.randint(0, 10), 
          "B" : random.randint(0, 10), 
          } 
    
         print "I generated " + str(self.d_variable_value) 
        # -------------------------------------------------------------------------- 
        def button_press(self, widget, event): 
         """button_press method.""" 
         if event.type == gtk.gdk.BUTTON_PRESS: 
          widget.popup(None, None, None, event.button, event.time) 
          return True 
    
         return False 
        # -------------------------------------------------------------------------- 
        def create_menu(self): 
         """Create a menu showing A and B.""" 
         # How can I update the menu after the user presses the 
         # "generate" button? 
    
         # If there are no values for A and B, generate them. 
         if not self.d_variable_value: 
          self.generate_variable_values() 
    
         # Show A and B in a menu. 
         menu = gtk.Menu() 
    
         for key, value in sorted(self.d_variable_value.items()): 
    
          text = key + " " + str(value) 
          item = gtk.MenuItem(text) 
          item.show() 
          menu.append(item) 
    
         return menu 
    # ------------------------------------------------------------------------------ 
    if __name__ == "__main__": 
        Generator() 
        gtk.main() 
    

    答えて

    2

    この行b.connect_object("event", self.button_press, self.create_menu())self.create_menu()によって作成gtk.Menuにevent信号にself.button_pressを接続しています。この行は決して再び実行されないので、メニューは常に同じです。

    eventシグナルをView A and Bボタンに接続してself.button_pressハンドラに接続し、そのハンドラが実行されるたびに更新されたメニューを作成しました。

    # ------------------------------------------------------------------------------ 
    # Python modules. Be alphabetical. 
    import random 
    # ------------------------------------------------------------------------------ 
    # Other Python modules. Be alphabetical. 
    import gtk 
    import pygtk 
    pygtk.require("2.0") 
    # ------------------------------------------------------------------------------ 
    class Generator: 
    
        """Generate values for two variables A and B.""" 
    
        def __init__(self): 
    
         # Create a dictionary in which a key is a variable name and a 
         # (dictionary) value is the variable value. 
         self.d_variable_value = {} 
         # ---------------------------------------------------------------------- 
         window = gtk.Window() 
         window.set_title("Generate") 
         window.connect("destroy", self.quit_event) 
         # ---------------------------------------------------------------------- 
         # Create a vertical box with two buttons. 
         vbox = gtk.VBox() 
    
         # Create a button to generate values for A and B. 
         b = gtk.Button("Generate A and B") 
         vbox.pack_start(b) 
         b.connect("clicked", self.generate_variable_values) 
    
         # Create a button to view A and B. 
         b = gtk.Button("View A and B") 
         vbox.pack_start(b) 
         b.connect("event", self.button_press) 
         # ---------------------------------------------------------------------- 
         window.add(vbox) 
         window.show_all() 
        # -------------------------------------------------------------------------- 
        def quit_event(self, widget=None, event=None): 
         """Quit.""" 
         gtk.main_quit() 
        # -------------------------------------------------------------------------- 
        def generate_variable_values(self, widget=None): 
         """Generate values for A and B.""" 
         self.d_variable_value = { 
          "A" : random.randint(0, 10), 
          "B" : random.randint(0, 10), 
          } 
    
         print "I generated " + str(self.d_variable_value) 
        # -------------------------------------------------------------------------- 
        def button_press(self, button, event): 
         """button_press method.""" 
         if event.type == gtk.gdk.BUTTON_PRESS: 
          menu = self.create_menu() 
          menu.popup(None, None, None, event.button, event.time) 
          return True 
    
         return False 
        # -------------------------------------------------------------------------- 
        def create_menu(self): 
         """Create a menu showing A and B.""" 
         # How can I update the menu after the user presses the 
         # "generate" button? 
    
         # If there are no values for A and B, generate them. 
         if not self.d_variable_value: 
          self.generate_variable_values() 
    
         # Show A and B in a menu. 
         menu = gtk.Menu() 
    
         print self.d_variable_value 
         for key, value in sorted(self.d_variable_value.items()): 
    
          text = key + " " + str(value) 
          item = gtk.MenuItem(text) 
          item.show() 
          menu.append(item) 
    
         return menu 
    # ------------------------------------------------------------------------------ 
    if __name__ == "__main__": 
        Generator() 
        gtk.main() 
    
    関連する問題