【问题标题】:How can i Refresh the Listview with python gtk?如何使用 python gtk 刷新 Listview?
【发布时间】:2014-01-10 13:39:33
【问题描述】:

我是 python 新手,我放了一个按钮来刷新列表视图并从 .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()

【问题讨论】:

    标签: python listview treeview gtk refresh


    【解决方案1】:

    您的代码有几个问题。

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

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

    1. 作为一种快速修复,您可以从 VBox 中删除现有的树视图,添加新的树视图并显示它。一个更简单的版本是将创建 vbox 的代码移动到一个单独的方法中,删除带有 self.remove(self.get_child()) 的 vbox 并重新添加它。这些中的任何一个都将完成代码所要做的事情。

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

    3. 另一种可能性是清空现有存储并重新填充它。树形视图将对商店的更改做出反应,无需调用set_model,也无需对树形视图进行任何其他提示。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-05-04
      • 1970-01-01
      • 1970-01-01
      • 2016-04-18
      • 2017-12-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多