如何使用PyGObject将弹出菜单附加到GTK2中的列标题按钮?

2024-09-29 09:25:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我想在用户右键单击Gtk.TreeView的标题行时弹出一个上下文菜单。在GTK3中,Gtk.TreeViewColumn有一个get_button()方法,这使得这项工作变得简单;只需将菜单附加到按钮上,并将其连接到“clicked”事件。然而,在GTK2中,这是行不通的。您只能调用get_widget()方法,如果您没有通过set_widget()设置小部件,则该方法返回None。我尝试过将列名为Gtk.Label放入Gtk.EventBox中,并将其设置为在将EventBox连接到“按钮按下事件”的回调之后的小部件,单击它不会生成事件。在

我试图做类似于列出的here的操作,但是在列小部件上执行get_parent()操作将返回None,并且永远不会像代码所示那样到达按钮。在

人们找到了什么解决办法?在


Tags: 方法用户none标题gtkget部件菜单
3条回答

这看起来确实很复杂,我看了一下source。显然,parent技巧起作用了(并返回对齐对象),但是只有在实现TreeviewColumn之后才将自定义标签添加到按钮中,因此在parent属性保留{}之前,可能是在Treeview的show命令之后,您应该能够检索父对象(button->;HBox->;对齐->标签),并可以将处理程序附加到信号。在

我喜欢在S.O上工作的例子,所以我决定发布一个。所有学分都是给@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()

黑客快乐!在

这其实很简单,但你需要一些黑客。在

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

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

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

^{pr2}$

最后,通过按钮引用,您可以做一些有用的事情:

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

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

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

相关问题 更多 >