我有一个列表框,其中有几行附加到窗口。
list_box = Gtk.ListBox()
list_box.insert(Gtk.Label('foo'), -1)
list_box.insert(Gtk.Label('bar'), -1)
list_box.insert(Gtk.Label('qux'), -1) # ListBoxRow is added automatically
window = Gtk.Window()
window.add(list_box)
window.show_all()
当我呼叫show_all()
时,列表的第一行会自动被选中,我不希望发生这种情况。如何防止自动选择呢?
我试着改变函数调用的顺序
window.show_all()
window.add(list_box)
打破了布局,窗口的大小不适合列表。
答案 0 :(得分:0)
ListBox
有一个属性selection-mode
,您可以将其设置为Gtk.SELECTION_NONE
。在这种情况下,不会选择任何行(以后不能选择)。我不知道这是不是你想要的。
您还可以调用方法unselect_all
,这将取消选择所有行。为此,ListBox必须处于SELECT_MULTIPLE或SELECT_SINGLE模式。
此示例似乎完全按预期工作(即在开始时没有选择,如果选择了一行,则按钮可以取消选择它)。如果在您的安装中它不起作用,我会尝试更新您的包:
from gi.repository import Gtk
class MainWindow(Gtk.Window):
def __init__(self):
Gtk.Window.__init__(self)
self.connect("delete-event", self.on_delete)
self.listbox = Gtk.ListBox()
self.listbox.insert(Gtk.Label('foo'), -1)
self.listbox.insert(Gtk.Label('bar'), -1)
self.listbox.insert(Gtk.Label('qux'), -1) # ListBoxRow is added automatically
button = Gtk.Button("Clear selection")
button.connect("clicked", self.on_button_clicked)
vbox = Gtk.VBox()
vbox.pack_start(button, False, True, 0)
vbox.pack_start(self.listbox, False, True, 0)
self.add(vbox)
self.show_all()
Gtk.main()
def on_button_clicked(self, btn):
self.listbox.unselect_all()
def on_delete(self, win, event):
Gtk.main_quit()
def main():
w = MainWindow()
return 0
if __name__ == '__main__':
main()
关于gtk3主题的说明:某些主题根本不显示所选行。特别黑暗的主题,例如。 FlatStudioDark,也是一些轻量级的主题。
答案 1 :(得分:0)
我也遇到了这个问题,我使用下面的代码来做到这一点:
listbox = Gtk.ListBox(margin=0)
listbox.set_selection_mode(Gtk.SelectionMode.NONE)
我仍然可以单击每一行,并对以下内容进行回调:
listbox.connect("row-activated", self.callback)
答案 2 :(得分:0)
在 list_box 顶部添加一个虚拟标签并将其隐藏:
dummyLabel = Gtk.Label('nothing') # workaround for focus of title entry
list_box.insert(dummyLabel, -1)
list_box.insert(Gtk.Label('foo'), -1)
list_box.insert(Gtk.Label('bar'), -1)
list_box.insert(Gtk.Label('qux'), -1) # ListBoxRow is added automatically
window = Gtk.Window()
window.add(list_box)
window.show_all()
dummyLabel.hide()
Gtk.main()
结果: result