2016-07-20 10 views
1

Поэтому у меня есть основная структура меню:Прикрепление/Клонирование подменю более одного пункта меню

menu = gtk.menu() 
item1 = gtk.MenuItem('Item 1') 
item2 = gtk.MenuItem('Item 2') 
menu.append(item1) 
menu.append(item2)` 
menu.show_all() 

И у меня есть подменю:

submenu = gtk.menu() 
subitem1 = gtk.MenuItem('Option 1') 
subitem2 = gtk.MenuItem('Option 2') 
submenu.append(subitem1) 
submenu.append(subitem2) 
submenu.show_all() 

Теперь я хочу подключить этот же подменю структуру для обоих пунктов меню верхнего уровня. Моя первая мысль была, что просто добавляя .set_submenu(submenu) как к item1 и item2 должны работать, но это дает мне ошибку:

Gtk-WARNING **: gtk_menu_attach_to_widget(): menu already attached to GtkMenuItem 

и подменю отображаются только на последнем пункте он был присоединен.

На практике у меня есть намного больше, чем два элемента верхнего уровня, и мне нужно привязать одну и ту же структуру подменю к большинству из них. Таким образом, определение одной и той же структуры подменю для каждого элемента на самом деле не является вариантом. Каков правильный способ сделать это?

+0

Это похоже на странную структуру. Зачем определять одно и то же подменю для нескольких элементов? Просто сделайте одно меню и решите элемент, которому он соответствует, посмотрев, на какой элемент пользователь щелкнул правой кнопкой мыши :) – joaquinlpereyra

+0

@joaquinlpereyra Ух, без щелчка правой кнопкой мыши (просто зависание), но я получаю дрейф. Я сделал аналогичный материал в javascript, но я не знаю, как это сделать в python. Любые примеры? – Razor

+0

Mhmmm, зависание кажется проблемой. Можете ли вы определить, где находится пользователь? Каким должен быть виджет ниже этого меню? – joaquinlpereyra

ответ

0

Поскольку предупреждение, которое вы получаете на терминале, указывает, что вы не можете присоединить один и тот же экземпляр GtkMenu к различным меню - так же, как вы не можете добавить один и тот же виджет в несколько контейнеров.

Ваша иерархия меню кажется слишком сложной, если вы обнаружите необходимость иметь одно и то же подменю в нескольких местах; это, несомненно, путает пользователей, которые полагаются на позиционную память для поиска действий в иерархической структуре меню.

В любом случае, если вы все еще хотите повторять меню, вы можете использовать простую функцию «фабрика меню» и сгенерировать несколько экземпляров из общего описания меню GtkBuilder XML.