显示大弹出菜单的正确方法是什么?

fos*_*dom 5 python gtk pygobject gtk3

一幅画描绘了一千个单词...:

在此处输入图片说明

在我的Python 2.7应用程序中,我有一个按钮,单击该按钮会弹出一个菜单。

在某些情况下,此列表大于屏幕尺寸。

  • 在Ubuntu 12.04(使用Gtk 3.4.2)中,这是可以的,因为您会看到滚动箭头(如右图所示)。

  • 在Ubuntu 12.10 / 13.04和Fedora 17(使用Gtk 3.6)中,我得到了相同的菜单,但是没有滚动箭头,并且无法使用鼠标向上或向下滚动。

奇怪的是,如果我再次单击该按钮,则会再次出现滚动箭头。

因此,它看起来像是某种大小分配问题-它不是在第一个弹出窗口中计算出来的,而是在随后的弹出窗口中计算的

因此我的问题

显然,新的GTK库已发生了某些变化-现在,显示大弹出菜单以确保显示滚动箭头的正确方法是什么?

有什么暗示我应该如何解决不同GTK版本之间的明显差异,以便获得一致的“首次单击时显示箭头”?

以下是演示此问题的简单python测试程序。

我无法使用GTKParasite进行诊断,因为只要您单击GtkParasite本身上的“检查”按钮,弹出窗口就会消失。

#-*-模式:python; 编码:utf-8;制表符宽度:4;indent-tabs-mode:nil; -*-

#!/ usr / bin / env python

从gi.repository导入Gtk

def popupclick(self,* args):
    popup.popup(无,无,无,无,0,
            Gtk.get_current_event_time())

窗口= Gtk.Window()
window.connect('delete_event',Gtk.main_quit)
window.set_default_size(200,200)

first_item =无
弹出窗口= Gtk.Menu()

对于我在范围(100)中:
    标签='项目%d'%i
    如果不是first_item:
        new_menu_item = Gtk.RadioMenuItem(label =标签)
        first_item = new_menu_item
    其他:
        new_menu_item = Gtk.RadioMenuItem.new_with_label_from_widget(
            group = first_item,label = label)

    new_menu_item.show()
    popup.append(new_menu_item)

按钮= Gtk.Button()
button.connect('clicked',popupclick)
主箱= Gtk.Box()
mainbox.pack_start(button,True,True,0)
scroller = Gtk.ScrolledWindow()
scroller.add_with_viewport(mainbox)
window.add(scroller)

window.show_all()

Gtk.main()

lib*_*rce 1

使用GtkComboBoxText。但正如 ptomato 所说,这种表示方式不适合包含大量值的列表。减少要显示的值的数量,或者使用GtkTreeView,它将有一个滚动条并且不需要初始单击来显示值。