gtk.TreeView在更改其gtk.ListStore后不会更改:

时间:2015-03-26 20:29:22

标签: python treeview gtk store pygtk

使用: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()

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

1 个答案:

答案 0 :(得分:1)

我不知道你的程序究竟是什么问题(如果你想知道,你应该提供工作最小的例子)。

然而,您不需要手动更新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并再次插入所有内容。对于更大量的数据,这将更有效。