6

当用户右键单击 a 的标题行时,我想弹出一个上下文菜单Gtk.TreeView。在 GTK3 中,Gtk.TreeViewColumn有一个 get_button() 方法,这使得这很容易;只需将菜单附加到按钮并将其连接到“单击”事件即可。但是,在 GTK2 中,这是行不通的。你只能调用一个get_widget()方法,如果你没有通过set_widget(). 我尝试将Gtk.Label带有列名的 a 放入 aGtk.EventBox并将其设置为小部件 将 连接EventBox到“button_press_event”的回调后,单击它不会生成事件。

我尝试执行此处列出的操作,但get_parent()在列小部件上执行操作会返回 None,并且永远不会像他们的代码所暗示的那样到达按钮。

人们为此找到了哪些解决方案?

4

3 回答 3

3

这实际上很容易,但是您需要一些技巧。

首先你需要强制 Gtk 为 GtkTreeViewColumn 创建一个标题按钮:

    label = gtk.Label("Column title")
    label.show()
    treeview_column.set_widget(label)

之后,您需要获取标头的内部 GtkButton :

    widget = treeview_column.get_widget()
    while not isinstance(widget, gtk.Button):
        widget = widget.get_parent()

最后使用按钮参考,您可以做一些有用的事情:

    def button_release_event(button, event):
        if event.button == 3:
           menu.popup(event)

    widget.connect('button-release-event', button_release_event)

这是从kiwi库中获取的,该库有一个ObjectList,它提供了一个类似于 api 的 python 列表,用于创建 GtkTreeViews。

于 2011-09-28T09:17:48.670 回答
0

这确实看起来很复杂,我查看了源代码。显然这个parent技巧有效(并返回对齐对象),但是您的自定义标签仅在实现 TreeviewColumn 后添加到按钮中,因此在此之前该parent属性保持不变None所以可能在您的 Treeview 的 show 命令之后最新,您应该能够检索父母(Button->HBox->Alignment->Label)并可以将您的处理程序附加到信号。

于 2011-09-16T17:58:05.230 回答
0

我喜欢关于 SO 的工作示例,所以我决定发布一个。所有的学分都是@Johan Dahlin!

#!/usr/bin/env python3

from gi.repository import Gtk

def button_release_event(button, event):
    if event.button == 3:
        menu.popup(None, None, None, None, event.button, event.time)


window = Gtk.Window()
window.connect("destroy", lambda q: Gtk.main_quit())

liststore = Gtk.ListStore(str)
liststore.append(["1"])
liststore.append(["2"])

menu=Gtk.Menu()
menu.append(Gtk.ImageMenuItem("Yep it works!"))
menu.append(Gtk.ImageMenuItem(":)"))
menu.show_all()

treeview = Gtk.TreeView(model=liststore)
window.add(treeview)

treeviewcolumn = Gtk.TreeViewColumn()
treeview.append_column(treeviewcolumn)    

# Set the treeviewcolum as clickable
#
treeviewcolumn.set_clickable(True)

# force Gtk to create a header button for the Gtk.TreeViewColumn
#
label = Gtk.Label("Numbers")
label.show()
treeviewcolumn.set_widget(label)

# fetch the internal GtkButton of the header:
#
widget = treeviewcolumn.get_widget()
while not isinstance(widget, Gtk.Button):
    widget = widget.get_parent()

widget.connect('button-release-event', button_release_event)

cellrenderertext = Gtk.CellRendererText()
treeviewcolumn.pack_start(cellrenderertext, True)
treeviewcolumn.add_attribute(cellrenderertext, 'text', 0)

window.show_all()
Gtk.main()

快乐的黑客!

于 2016-01-03T22:35:53.603 回答