gtk.TreeView 在改变其 gtk.ListStore 后没有改变:

gtk.TreeView does not change after changing its gtk.ListStore:

已使用:python 2.79,gtk 2.0

尊敬的 python 和 PyGtk 用户

在我的程序中,我想提供机会使用代码中的方法在 gtk.TreeView 中显示一个很棒的数据文件的搜索结果。在创建 ListStore 的函数中,我还创建了商店正在使用的 csv 文件。现在我可以看到,在使用不同的关键字进行新搜索后 csv 文件发生了变化,但 TreeView 没有,它仍然保留第一次搜索的结果,尽管我每次都清除商店 self.search 是 运行。如果您需要为每个新搜索重新启动程序,那真的很令人兴奋...

我已经尝试了一些东西,比如为商店的数据创建创建一个合适的函数,但没有任何效果,事实上我没有太多想法...

我在互联网上找到的所有关于此的内容都是关于使用计时器自动刷新商店或其他更深刻的主题,似乎每个人而不是我都知道如何做到这一点...

谁能告诉我,我犯了什么错误?如何刷新 TreeView?(如您所见 self.search 由按钮调用...)这里是代码的相关部分:

import gtk, csv

class BASE:

    #...
    #some other funtions, irrelevant for the problem
    #...

    def search(self, widget, event, data=None):

        #...
        #all the searchingstuff and the creation of 'inwrite.csv'
        #...


        with open('/home/emil/Documents/inwrite.csv', 'r') as storefile:
            lines = storefile.readlines()


        store = gtk.ListStore(str, str, str, str, str, str)

        store.clear()       

        i=0

        while i < len(lines):
            line = [lines[i]]
            csvfile = csv.reader(line, delimiter=',')
            for row in csvfile:
                temp = (row[0], row[1], row[2], row[3], row[4], row[5])
            store.append(temp)
            i = i + 1



        self.tabview = gtk.TreeView(store)
        self.tabview.set_rules_hint(True)
        self.tabview.set_reorderable(True)
        self.sw.add(self.tabview)
        self.tabview.show()

        self.create_columns(self.tabview)

    def __init__(self):

        #...
        #creating the Window, entries,...
        #...

        self.button1 = gtk.Button('Buscar')
        self.button1.connect('clicked', self.search, 'button 1')

        #...
        #packing and showing the whole GUI
        #...

    def create_columns(self, tabview):

        rendererText = gtk.CellRendererText()
        rendererText.props.wrap_width = 80
        rendererText.props.wrap_mode = gtk.WRAP_WORD
        column = gtk.TreeViewColumn('Codigo', rendererText, text=0)
        column.set_sort_column_id(0)    
        self.tabview.append_column(column)

        #...
        #creating 5 more columns by the same principle
        #...

    def main(self):
        gtk.main()


if __name__=='__main__':
    base = BASE()
    run = base
    run.main()

感谢您的帮助,如果您需要更多信息,请告诉我!

我不知道你的程序到底出了什么问题(如果你想知道,你应该提供一个工作最小的例子)。

不过,您不需要手动更新TreeView,因为TreeView 始终显示ListStore 或TreeStore 的内容。您也不必每次都创建 ListStore。您可以创建一次并在事件发出时清除并插入新条目。

这是一个展示它如何工作的小例子:

#from gi.repository import Gtk  # uncomment to use PyGObject
import gtk as Gtk

class TestCase:
    def __init__(self):
        win = Gtk.Window()
        button = Gtk.Button('Show')
        button.connect('clicked', self.on_button_clicked)

        self.clicked = 0
        self.liststore = Gtk.ListStore(int)
        self.liststore.append((self.clicked,))
        view = Gtk.TreeView(self.liststore)
        renderer = Gtk.CellRendererText()
        column = Gtk.TreeViewColumn('demo', renderer, text=0)
        view.append_column(column)

        box = Gtk.HBox()
        box.pack_start(button, True, True, 0)
        box.pack_start(view, True, True, 0)
        win.add(box)
        win.connect('delete-event', Gtk.main_quit)
        win.show_all()

    def on_button_clicked(self, button):
        self.clicked += 1
        self.liststore.clear()
        self.liststore.append((self.clicked,))


if __name__ == "__main__":
    TestCase()
    Gtk.main()

您似乎也是先创建 csv 文件,然后再读取它。我不知道你程序的其余部分,但最好直接使用数据并将其插入 ListStore 而不是从 csv 文件中读取它。甚至可能只删除和插入新条目而不清除整个 ListStore 并再次插入所有内容。如果数据量更大,效率会更高。