无法获取 Gtk.ListBox() 对象以在 Python 运行时添加新的 Gtk.ListBoxRow() 对象



我在Windows 10到Python 3.4上使用Gtk 3.18。我编写了以下脚本来按下一个按钮,将一个新的 Gtk.ListBoxRow() 添加到我的 MyWindow 类中的 self.listbox 中。它发生在函数add_item(self,whatevs)中。

我在那里明确提到

self.listbox.add(row)

那为什么它仍然不起作用?当我按下"添加项目"按钮时,正在调用该函数。但是该列表没有另一行。为什么这么好?

什么也没发生。甚至不显示任何错误。有人可以告诉我我在这里做错了什么吗?任何帮助,不胜感激。

import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk
class MyWindow(Gtk.Window):
    def __init__(self):
        Gtk.Window.__init__(self, title = "Win win win")
        self.set_border_width(3)
        self.set_default_size(300, 250)
        box = Gtk.Box(orientation = Gtk.Orientation.VERTICAL, spacing = 6)
        self.add(box)
        self.listbox = Gtk.ListBox()
        self.listbox.set_selection_mode(Gtk.SelectionMode.SINGLE)
        box.pack_start(self.listbox, True, True, 0)
        row = Gtk.ListBoxRow()
        hbox = Gtk.Box()
        row.add(hbox)
        hbox.pack_start(Gtk.Label("Here is an Item"), True, True, 0)
        self.listbox.add(row)
        hbox = Gtk.Box()
        button_add_item = Gtk.Button(label = "Add Item", valign = Gtk.Align.CENTER)
        button_add_item.connect("clicked", self.add_item)
        hbox.pack_start(button_add_item, True, True, 0)
        button_remove_item = Gtk.Button(label = "Remove Item", valign = Gtk.Align.CENTER)
        button_remove_item.connect("clicked", self.remove_item)
        hbox.pack_start(button_remove_item, True, True, 0)
        box.pack_start(hbox, False, True, 0)
    def add_item(self, whatevs):
        row = Gtk.ListBoxRow()
        hbox = Gtk.Box()
        row.add(hbox)
        item_label = Gtk.Label("Here is another Item")
        hbox.pack_start(item_label, True, True,0)
        self.listbox.add(row)
    def remove_item(self, whatevs):
        self.listbox.remove(self.listbox.remove.get_row_at_y(-1))
win = MyWindow()
win.connect('delete-event', Gtk.main_quit)
win.show_all()
Gtk.main()

顺便问一下,有人可以告诉我为什么我必须在按钮的"连接"函数中包含另一个参数,而不是"self"?知道我如何使用它们吗?

我发现了问题所在。我应该在我的程序中使用 self.listbox 对象的 Gtk.ListBox.show_all() 函数。跳这个帮助某人将来。

正如@shaan-repswal已经说过的,您可以在将小部件添加到列表后调用Gtk.ListBox.show_all()

请记住,如果您的行包含您希望保持不可见的小部件,则必须这样做,具体取决于您管理小部件的方式:

  • 呼叫your_widget.set_no_show_all(True) ;
  • 将微件的属性props.no_show_all设置为 True
  • 添加行

    <property name="no_show_all">True</property>

    添加到 GLADE 文件中微件的object标签。

来源: https://stackoverflow.com/a/29130873/9402438

我最初正在寻找这个问题,关于 C。然而,我偶然发现了这个问题,所以 C 中的相应函数被称为:

gtk_widget_show_all(your_list_box);

最新更新