gpt4 book ai didi

python - 聚焦时不要设置 Gtk.TreeView 的选择?

转载 作者:太空宇宙 更新时间:2023-11-03 11:50:59 27 4
gpt4 key购买 nike

以下代码显示一个带有按钮和 TreeView 的窗口。 “点击”信号的句柄附加到按钮并聚焦 TreeView 。当窗口最初显示时,树选择没有选中的项目,但是当 TreeView 获得焦点时,第一个项目被自动选中。当 TreeView 获得焦点时,有没有办法阻止进行选择?

window before clicking window after clicking
点击之前,按钮有焦点,树选择没有选中的项目。单击后, TreeView 有焦点,但已选择一个项目。

由此产生的问题是我有一个界面,它通过附加到 TreeView 的树选择上的“已更改”信号来保持某些内容同步。当窗口显示时,根据 TreeView 在界面中的位置,它们可能默认获得焦点。这会导致“更改”信号,并发生意外同步。可以为所有 TreeView 调用 set_can_focus(False),但是:

  1. 仅防止键盘循环焦点,而不是程序焦点,并且选择仍然以程序焦点打开;和
  2. 似乎禁用了取消选择一个选择的能力(例如,通过按住 control 键并单击一行)。

同样,我可以使用 grab_default 来确保在显示窗口时其他内容首先获得焦点,但它不会阻止杂散焦点事件进行意外选择。

基于 a posted answer那就是说选择模式 SINGLE“需要至少选择一个项目”,这解释了为什么选择焦点元素,我更多地研究了选择模式常量。其中,SINGLEBROWSE 似乎最相关。 pygtk 文档,GTK Selection Mode Constants , 只说:

gtk.SELECTION_SINGLE A single selection allowed by clicking.
gtk.SELECTION_BROWSE A single selection allowed by browsing with the pointer.

GTK+3 文档,enum GtkSelectionMode , 进入更多细节:

GTK_SELECTION_SINGLE Zero or one element may be selected.
GTK_SELECTION_BROWSE Exactly one element is selected. In some circumstances, such as initially or during a search operation, it’s possible for no element to be selected with GTK_SELECTION_BROWSE. What is really enforced is that the user can’t deselect a currently selected element except by selecting another element.

我在这里看不到任何内容,建议在选择模式单例时至少选择一个元素。

下面是重现窗口的代码并作为示例。

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()

最佳答案

查看 root/gtk/gtktreeview.c for tree_view.grab_focus() 中的源代码,我们可以看到 gtk_tree_view_focus_to_cursor 总是被调用,并选择第一个元素。不过,在某些情况下,您可以解决这个问题。

这是一个令人讨厌的 hack。

它重写了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

不幸的是,它只适用于从 Python 调用 grab_focus 时,其他调用者(例如 GTK 的键盘导航)不适用。

关于python - 聚焦时不要设置 Gtk.TreeView 的选择?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28173567/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com