【问题标题】:gtk.TreeView does not change after changing its gtk.ListStore:gtk.TreeView 在更改其 gtk.ListStore 后不会更改:
【发布时间】:2015-05-31 01:05:40
【问题描述】:

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

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

【问题讨论】:

    标签: python treeview gtk store pygtk


    【解决方案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 并再次插入所有内容。如果数据量更大,那会更有效。

    【讨论】:

    • 工作正常,非常感谢!下次我会写例子。是的,我只是使用 csv.writer 知道,实现失败的地方,现在我将直接插入数据。您最后的建议听起来也很合理,但是搜索结果通常不是很大(数据库是)但差异很大,因此清除列表存储的成本并不高。
    猜你喜欢
    • 2019-12-03
    • 2021-01-24
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-24
    • 2020-11-18
    相关资源
    最近更新 更多