编程语言
首页 > 编程语言> > python – 显示大弹出菜单的正确方法是什么?

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