0

私の小さなPyGObject/GTK3アプリケーションでは、RadioMenuItemsで構成される(サブ)メニューを作成しようとしています。

メインウィンドウの次のようにメニューを作成します__init__

menu_item = None
self.menu = Gtk.Menu()
self.menu_items = {}
for i in range(1,5):
   menu_item = Gtk.RadioMenuItem(menu_item)
   menu_item.set_label(str(i))
   self.menu_items[i] = menu_item
   self.menu.append(self.menu_items[i])
   self.menu_items[i].connect("activate",
                        self.on_menu_select,
                        i)
   self.menu_items[i].show()

次に、button_press_eventを使用してハンドラーに表示します

def button_press(self, widget, event, data=None):
    for i in range(1,5):
        self.menu_items[i].set_active(False)
    self.menu_items[2].set_active(True)
    self.menu.popup(None, None, None, None,
                            event.button, event.time)

初めてメニューを開いたとき、メニュー項目「2」だけが正しく選択されています。次に、たとえば、メニュー項目「3」を選択してメニューを再度開くと、メニュー項目2と3の両方が選択されています。私は何が間違っているのですか?

4

1 に答える 1

1

ラジオメニュー項目を互いにグループ化する必要があります。そうしないと、別の項目が選択されたときに選択を解除することができません。

self.menu = Gtk.Menu()
self.menu_items = list()
group = []
for i in range(1,5):
    menu_item = Gtk.RadioMenuItem.new_with_label(group, str(i))
    group = menu_item.get_group()
    self.menu_items[i] = menu_item
    self.menu.append(menu_item)
    menu_item.connect("activate", self.on_menu_select, i)
    menu_item.show()

self.menu_items[2].set_active(True)

この行はアイテム番号2を選択することに注意してください。自分で行う必要はないため、ボタンを押すハンドラーは次のようになります。

def button_press(self, widget, event, data=None):
    self.menu.popup(None, None, None, None,
                    event.button, event.time)
于 2012-04-29T09:38:23.980 に答える