当用户右键单击Gtk.TreeView
的标题行时,我想弹出一个上下文菜单。在GTK3中,Gtk.TreeViewColumn
有一个get_button()方法,这使得这很简单;只需将菜单附加到按钮并将其连接到“点击”事件即可。但是,在GTK2中,这不起作用。您只能调用get_widget()
方法,如果您尚未通过set_widget()
设置小部件,则会返回“无”。我已经尝试将Gtk.Label
列名称放入Gtk.EventBox
并将其设置为小部件将EventBox
连接到'button_press_event'的回调后,点击它就不会t生成事件。
我尝试做类似列出here的内容,但在列小部件上执行get_parent()
会返回None,并且永远不会按照代码的含义到达按钮。
人们为此找到了哪些解决方案?
答案 0 :(得分: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。
答案 1 :(得分:0)
这看起来确实很复杂,我看了source。显然parent
技巧有效(并返回对齐对象),但是自定义标签仅在实现TreeviewColumn后添加到按钮中,因此parent
属性保持None
}因此,在您对Treeview的show命令发布后,您应该能够检索父项(Button-> HBox-> Alignment-> Label)并将处理程序附加到信号上。
答案 2 :(得分:0)
我喜欢在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()
快乐的黑客攻击!