5

一张图画一千个字……:

在此处输入图像描述

在我的 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 本身的“检查”按钮,弹出窗口就会消失。

# -*- 模式:python;编码:utf-8;制表符宽度:4;缩进制表模式:无;-*-

#!/usr/bin/env python

从 gi.repository 导入 Gtk

def popupclick(self, *args):
    popup.popup(无,无,无,无,0,
            Gtk.get_current_event_time())

窗口 = Gtk.Window()
window.connect('delete_event', Gtk.main_quit)
window.set_default_size(200,200)

first_item = 无
弹出 = Gtk.Menu()

对于范围内的我(100):
    标签 = '项目 %d' % i
    如果不是 first_item:
        new_menu_item = Gtk.RadioMenuItem(label=label)
        first_item = new_menu_item
    别的:
        new_menu_item = Gtk.RadioMenuItem.new_with_label_from_widget(
            组=第一项,标签=标签)

    new_menu_item.show()
    popup.append(new_menu_item)
    
按钮 = Gtk.Button()
button.connect('点击', popupclick)
主机箱 = Gtk.Box()
mainbox.pack_start(按钮,真,真,0)
滚动条 = Gtk.ScrolledWindow()
scroller.add_with_viewport(mainbox)
window.add(滚动条)
    
window.show_all()

gtk.main()
4

2 回答 2

2

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

但是,您似乎最好打开一个带有可滚动列表的窗口!

于 2013-01-21T09:05:50.553 回答
1

使用GtkComboBoxText。但正如 ptomato 所说,这种表示方式不适合包含大量值的列表。要么减少要显示的值的数量,要么使用GtkTreeView,它将有一个滚动条并且不需要初始点击来显示值。

于 2013-01-21T09:58:04.703 回答