2010-12-04 91 views
1

我不太熟悉PyGTK。请参阅下面的代码。是否有可能做到以下几点?如何在PyGTK中按下按钮后更新菜单?

  1. 有两个按钮,我们称之为“生成”和“视图”。
  2. 的“生成”按钮将生成变量A的随机值和B.
  3. “查看”按钮,会弹出显示A和B.

问题用下面的代码的菜单是“view”菜单显示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.button_pressself.create_menu()建立的意见gtk.Menu的event信号。这条线永远不会再执行,所以菜单总是一样的。

我所做的就是连接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()