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

Python 显示大型弹出菜单的正确方法是什么?,python,gtk,gtk3,pygobject,Python,Gtk,Gtk3,Pygobject,一幅画画千言万语……: 在我的Python2.7应用程序中,我有一个按钮,单击它会弹出一个菜单 在某些情况下,此列表大于屏幕大小 在Ubuntu12.04(使用GTK3.4.2)中,这是可以的,因为您可以看到滚动箭头(如图右侧所示) 在Ubuntu12.10/13.04和Fedora17(使用GTK3.6)中,我得到了相同的菜单,但没有滚动箭头,您不能使用鼠标上下滚动 奇怪的是,如果我再次单击按钮,滚动箭头会重新出现 所以它看起来像是某种大小分配问题——它不是在第一个弹出窗口中计算的,

一幅画画千言万语……:

在我的Python2.7应用程序中,我有一个按钮,单击它会弹出一个菜单

在某些情况下,此列表大于屏幕大小

  • 在Ubuntu12.04(使用GTK3.4.2)中,这是可以的,因为您可以看到滚动箭头(如图右侧所示)

  • 在Ubuntu12.10/13.04和Fedora17(使用GTK3.6)中,我得到了相同的菜单,但没有滚动箭头,您不能使用鼠标上下滚动

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

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

因此我的问题是 较新的GTK库显然发生了一些变化-现在显示大型弹出菜单以确保显示滚动箭头的正确方法是什么

有没有提示我应该如何处理不同GTK版本之间的这种明显差异,以便我可以获得一致的“第一次单击时显示箭头”

下面是一个简单的python测试程序,演示了这个问题

我无法使用GTKParasite诊断此问题,因为只要单击GTKParasite上的“检查”按钮,弹出窗口就会消失

# -*- Mode: python; coding: utf-8; tab-width: 4; indent-tabs-mode: nil; -*- #!/usr/bin/env python from gi.repository import Gtk def popupclick(self, *args): popup.popup(None, None, None, None, 0, Gtk.get_current_event_time()) window = Gtk.Window() window.connect('delete_event', Gtk.main_quit) window.set_default_size(200,200) first_item = None popup = Gtk.Menu() for i in range(100): label = 'Item %d' % i if not first_item: new_menu_item = Gtk.RadioMenuItem(label=label) first_item = new_menu_item else: new_menu_item = Gtk.RadioMenuItem.new_with_label_from_widget( group=first_item, label=label) new_menu_item.show() popup.append(new_menu_item) button = Gtk.Button() button.connect('clicked', popupclick) mainbox = 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() #-*-模式:python;编码:utf-8;标签宽度:4;缩进制表符模式:无-*- #!/usr/bin/env python 从gi.repository导入Gtk def弹出式单击(自身,*args): 弹出。弹出(无,无,无,无,0, Gtk.get_current_event_time()) window=Gtk.window() window.connect('delete_event',Gtk.main_quit) 窗口。设置默认大小(200200) 第一项=无 popup=Gtk.Menu() 对于范围(100)内的i: 标签='项目%d'%1!' 如果不是第一项: 新菜单项=Gtk.RadioMenuItem(标签=标签) 第一项=新建菜单项 其他: 新建菜单项=Gtk.RadioMenuItem.new\u,带有来自小部件的标签( 组=第一项,标签=标签) 新建菜单项。显示() popup.append(新建菜单项) button=Gtk.button() 按钮连接('clicked',popupplick) mainbox=Gtk.Box() mainbox.pack_start(按钮,真,真,0) scroller=Gtk.ScrolledWindow() 滚动条。使用视口添加视口(主框) 添加(滚动条) window.show_all() Gtk.main()
我在文档中浏览了一下,没有使用
popup.append(新菜单项)
你可以使用
popup.attach(新菜单项,左、右、上、下)
将菜单项放在一个网格中,而不是一条长线


不过,似乎你最好打开一个带有滚动列表的窗口

使用。但正如托马托所说,这种呈现方式不适合于大量价值的列表。减少要显示的值的数量,或者使用一个滚动条,它将有一个滚动条,不需要初始单击即可显示值。

翻转回答:不要这样做,这是一个UX噩梦;-)@ptomato-hmmm-有没有关于GTK友好小部件的其他想法,可以“弹出”一些可以包含很多选择的东西-我不喜欢从头开始写很多代码-希望我可以“借用”一些GPL2/3小部件,比如弹出式滚动列表?