- python/
- Python 显示大型弹出菜单的正确方法是什么?
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小部件,比如弹出式滚动列表?