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

时间:2013-01-20 11:22:10

标签: python gtk gtk3 pygobject

一张图片描绘了千言万语......:

enter image description here

在我的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()

2 个答案:

答案 0 :(得分:2)

我在文档中浏览了一下,而不是使用popup.append(new_menu_item),您可以使用popup.attach(new_menu_item, left, right, top, bottom)将菜单项放在网格中而不是一条长行。

但是看起来你打开一个带有可滚动列表的窗口会更好!

答案 1 :(得分:1)

使用GtkComboBoxText。但正如ptomato所说,这种表述并不适用于大量价值观的清单。要么减少要显示的值的数量,要么使用GtkTreeView,它将有一个滚动条,并且不需要初始点击来显示值。