如何使用python gtk刷新Listview?

时间:2013-12-22 00:06:57

标签: python listview treeview gtk refresh

我是python的新手,我放了一个按钮来刷新listview并从.txt文件中获取信息,但它不起作用:(

以下是代码:

import gtk


actresses = [i.strip().replace("'", "").split() for i in open("lista.txt").readlines()]


class PyApp(gtk.Window): 
    def __init__(self):
        super(PyApp, self).__init__()

        self.set_size_request(350, 250)
        self.set_position(gtk.WIN_POS_CENTER)

        self.connect("destroy", gtk.main_quit)
        self.set_title("ListView")

        self.Boton = gtk.Button("click")
        self.Boton.connect("clicked",self.create_list)

        self.Boton.show()

        vbox = gtk.VBox(False, 8)

        sw = gtk.ScrolledWindow()
        sw.set_shadow_type(gtk.SHADOW_ETCHED_IN)
        sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)

        vbox.pack_start(sw, True, True, 0)
        vbox.pack_start(self.Boton, True, True, 0)

        store = self.create_model()

        treeView = gtk.TreeView(store)
        treeView.connect("row-activated", self.on_activated)
        treeView.set_rules_hint(True)
        sw.add(treeView)

        self.create_columns(treeView)
        self.statusbar = gtk.Statusbar()

        vbox.pack_start(self.statusbar, False, False, 0)

        self.add(vbox)
        self.show_all()


    def create_model(self):
        store = gtk.ListStore(str, str, str)

        for act in actresses:
            store.append([act[0], act[1], act[2]])

        return store


    def create_columns(self, treeView):

        rendererText = gtk.CellRendererText()
        column = gtk.TreeViewColumn("Nombre", rendererText, text=0)
        column.set_sort_column_id(0)    
        treeView.append_column(column)

        rendererText = gtk.CellRendererText()
        column = gtk.TreeViewColumn("apellido", rendererText, text=1)
        column.set_sort_column_id(1)
        treeView.append_column(column)

        rendererText = gtk.CellRendererText()
        column = gtk.TreeViewColumn("Tamaño", rendererText, text=2)
        column.set_sort_column_id(2)
        treeView.append_column(column)


    def on_activated(self, widget, row, col):

        model = widget.get_model()
        text = model[row][0] + ", " + model[row][1] + ", " + model[row][2]
        self.statusbar.push(0, text)
    if model[row][0] == "lol":
       print "Funciona"

    def create_list(self, widget):
        # create a TreeView object which will work with our model (ListStore)
        self.listview = self.create_model()
        self.treeView = gtk.TreeView(self.listview)
        self.treeView.set_rules_hint(True)

PyApp()
gtk.main()

1 个答案:

答案 0 :(得分:0)

您的代码有几个问题。

首先,由create_model调用的create_list方法不会重新读取文件,而是使用在顶层初始化的对象。要解决此问题,请create_model调用阅读代码。

更重要的是,create_list方法正在创建一个新的树视图,但是没有对它做任何事情(除了将它存储到Python实例的属性之外)。就GTK窗口而言,您的旧树视图仍在窗口中。有几种方法可以解决这个问题:

  1. 作为快速修复,您可以从VBox中删除现有树视图,添加新视图并显示它。更简单的版本是将创建vbox的代码移动到单独的方法,使用self.remove(self.get_child())删除vbox并重新添加。其中任何一个都将完成代码的设定目标。

  2. 更好的解决方法是仅使用set_model方法重新创建商店并将树视图切换到新商店。

  3. 另一种可能性是清空现有商店并重新填充它。树视图将对商店的更改做出反应,无需调用set_model,也无需调用树视图。