pygobject树视图在加载并在运行时填充后显示为空

时间:2015-03-25 08:06:49

标签: python treeview gtk pygobject

这是我第一次在阅读了有用的答案后,需要在这里发帖。

在这个问题中,我正在使用 python3 pygobject 。我刚开始学习pygobject。

我的程序包含一个包含按钮的堆栈。当按下按钮时,我创建一个列表存储和树视图并制作,将其添加到堆栈并使其可见。

  • 期待 当我按下按钮时,我会看到树状视图
  • 发生 当我按下按钮时,界面没有发生任何变化
  • 当我再次按下按钮时,堆栈将变为树视图。 应该是第一次发生

我在windows和linux中看到过这种行为。

这是我的代码:

from gi.repository import Gtk

#list of tuples for each software, containing the software name, initial release, and main programming languages used
software_list = []

class TreeViewFilterWindow(Gtk.Window):

    def __init__(self):
        #init window
        Gtk.Window.__init__(self, title="Treeview Filter Demo")
        self.resize (500, 500)

        #create stack
        self.stack = Gtk.Stack()
        self.add (self.stack)

        #create button. when pressed, it will create tree view and show it
        #add button to stack
        button = Gtk.Button (label='create tree')
        button.connect ('clicked', self.create_tree)
        self.stack.add (button)

        #init tree view to none
        #button is pressed while there is a treeview, no need to create it. just make it visible
        self.treeview = None


    def create_tree (self, widget):
        #if tree view is none, create it
        if not self.treeview:
            #Creating the ListStore model
            self.software_liststore = Gtk.ListStore(str, int)

            #creating the treeview
            self.treeview = Gtk.TreeView(self.software_liststore)

            #adding two columns
            renderer = Gtk.CellRendererText()
            column = Gtk.TreeViewColumn('software', renderer, text=0)
            self.treeview.append_column(column)
            renderer = Gtk.CellRendererText()
            column = Gtk.TreeViewColumn('release year', renderer, text=1)
            self.treeview.append_column(column)

            #add to stack
            self.stack.add(self.treeview)

            #append 1 column
            self.software_liststore.append (('pitivi', 2005))

        #set visible
        self.stack.set_visible_child (self.treeview)

        #if show_all is not called, the tree view is never shown
        self.stack.show_all()


win = TreeViewFilterWindow()
win.connect("delete-event", Gtk.main_quit)
win.show_all()
Gtk.main()
我错过了什么?这是一个错误吗? 我每次添加新的小部件时都需要调用show_all吗?

谢谢

1 个答案:

答案 0 :(得分:1)

创建树视图后,您错过了对self.treeview.show_all()的调用,例如在调用self.software_liststore.append之后(但仍在if内)。您可以删除对self.stack.show_all()的呼叫,因为已经显示了堆栈,这可以通过在顶层调用win.show_all()来确保。

为什么您对self.stack.show_all()的调用不包含已添加到堆栈的树视图,这一点并不明显。如果您将Gtk.Stack更改为Gtk.HBoxadd()更改为pack_start(),则不再需要在树视图上显式调用show_all。这不适用于GtkStack可能是GTK错误或由set_visible_child实现的转换的异步性质的结果。