这是我第一次在阅读了有用的答案后,需要在这里发帖。
在这个问题中,我正在使用 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吗?
谢谢
答案 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.HBox
而add()
更改为pack_start()
,则不再需要在树视图上显式调用show_all
。这不适用于GtkStack
可能是GTK错误或由set_visible_child
实现的转换的异步性质的结果。