python – 显示大弹出菜单的正确方法是什么?
作者:互联网
一张图片描绘了千言万语……:
在我的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本身的“Inspect”按钮,弹出窗口就会消失.
# -*- 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()
解决方法:
使用GtkComboBoxText.但正如ptomato所说,这种表述不适用于大量价值观的列表.要么减少要显示的值的数量,要么使用GtkTreeView,它将具有滚动条,并且不需要初始单击来显示值.
标签:python,gtk,pygobject,gtk3 来源: https://codeday.me/bug/20190629/1329345.html