Jos*_*lor 5 python gtk pygtk python-3.x gtk3
以下代码显示带有按钮和树状视图的窗口。“点击”信号的句柄连接到该按钮,并聚焦树视图。最初显示窗口时,树选择没有选定的项目,但是当树视图获得焦点时,将自动选择第一个项目。当树形视图获得焦点时,是否有一种方法可以防止做出选择?

单击之前,按钮具有焦点,并且树选择没有选定项目。单击后,树形视图具有焦点,但是已选择一个项目。
由此产生的问题是,我有一个接口,通过在树视图的树选择上附加“已更改”信号来使某些事物保持同步。显示窗口时,根据树状视图在界面中的位置,默认情况下它们可能会获得焦点。这会导致信号“改变”,并发生意外的同步。可以为所有树视图调用set_can_focus(False),但是:
类似地,我可以使用grab_default来确保在显示窗口时其他东西首先获得焦点,但是它不会使杂散焦点事件无法做出意外选择。
基于一个已发布的答案,该答案说选择模式SINGLE“至少需要选择一个项目”,并且这说明了为什么选择一个元素作为焦点的原因,我进一步研究了选择模式常量。其中,单和浏览似乎最相关的。pygtk文档GTK Selection Mode Constants只说:
gtk.SELECTION_SINGLE通过单击允许一个选择。
gtk.SELECTION_BROWSE通过使用指针浏览允许的单个选择。
GTK + 3文档枚举GtkSelectionMode更加详细:
GTK_SELECTION_SINGLE可以选择零个或一个元素。
GTK_SELECTION_BROWSE恰好选择了一个元素。在某些情况下,例如最初或在搜索操作期间,可能无法使用GTK_SELECTION_BROWSE选择任何元素。真正强制执行的是,用户只能通过选择另一个元素来取消选择当前选择的元素。
我没有看到任何建议选择模式为“单”时必须至少选择一个元素的信息。
这里是重现窗口并用作示例的代码。
from gi.repository import Gtk
# A ListStore with some words
list_store = Gtk.ListStore(str)
for selection in "Can a machine think?".split():
list_store.append([selection])
# A TreeView with a single column
tree_view = Gtk.TreeView(model=list_store)
cell_renderer = Gtk.CellRendererText()
tree_view_column = Gtk.TreeViewColumn(cell_renderer=cell_renderer,text=0,title='Words')
tree_view.append_column(tree_view_column)
# A button to focus the list
focus = Gtk.Button(label='Focus List')
focus.connect('clicked',lambda *_: tree_view.grab_focus())
# A Box to hold everything, and a Window for the Box.
box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
box.add(focus) # button on top gets initial focus
box.add(tree_view) # tree_view below doesn't, and has no selected items
window = Gtk.Window()
window.add(box)
window.show_all()
Gtk.main()
Run Code Online (Sandbox Code Playgroud)
查看root/gtk/gtktreeview.c 中的 tree_view.grab_focus()源代码,我们可以看到 gtk_tree_view_focus_to_cursor 总是被调用,并选择第一个元素。不过,在某些情况下,您可以解决这个问题。
这是一个令人讨厌的黑客行为。
它重写该grab_focus方法,在调用之前存储选择grab_focus,如果之前没有选择,则在之后清除选择。
def tree_view_grab_focus():
selection = tree_view.get_selection()
_, selected = selection.get_selected()
Gtk.TreeView.grab_focus(tree_view)
if selected is None:
selection.unselect_all()
tree_view.grab_focus = tree_view_grab_focus
Run Code Online (Sandbox Code Playgroud)
不幸的是,它仅适用于从 Python 调用时grab_focus,其他调用者(例如 GTK 的键盘导航)则不适用。
| 归档时间: |
|
| 查看次数: |
1296 次 |
| 最近记录: |