【问题标题】:Python GtkTreeview; How to refresh the list when an item is selectedPython GtkTreeview;选择项目时如何刷新列表
【发布时间】:2011-10-16 06:37:02
【问题描述】:

我正在制作一个基本的文件管理器,并被困在我帖子标题中的问题上。 首先它在一个目录中查找,生成一个项目列表,并将它们附加到树视图列表中。

如果单击子目录,它将成为新的当前目录。我所需要的只是将它发送回 def 中,它读取并显示当前目录内容(我认为)。

    import gtk, os

    class PyApp(gtk.Window): 
        def __init__(self):
            super(PyApp, self).__init__()
            self.set_size_request(250, 200)
            self.set_position(gtk.WIN_POS_CENTER)
            self.connect("destroy", gtk.main_quit)
            self.set_title("SteveFM")
            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)
            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.add(vbox)
            self.show_all()

        #  Take the names of files and subdirectories in 
        #  the current directory and sort them into a list for treeview

        def create_model(self):
            store = gtk.ListStore(str)
            dirList=os.listdir(os.getcwd())
            dircontents = []
            for item in dirList: 
                if item[0] != '.':
                    if os.path.isdir(item):
                        dircontents.append(['/'+item])
                    else:
                        dircontents.append([item])
            dircontents.sort() 
            for act in dircontents:
                store.append([act[0]])
            return store

        #  If a file is clicked, open with leafpad.
        #  If a directory is clicked, change the current working directory to it
        #  and (my hurdle) replace the current treeview list with the contents of the 
        #  new directory, just like a file manager.

        def on_activated(self, widget, row, col):
            model = widget.get_model()
            target = model[row][0]
            if target[0] != "/":
                cmd = "leafpad "+target
                os.system(cmd)
            else:
                os.chdir(os.getcwd()+target)
                print os.getcwd()   # Just for debugging

        def create_columns(self, treeView):
            rendererText = gtk.CellRendererText()
            column = gtk.TreeViewColumn(None, rendererText, text=0)
            column.set_sort_column_id(0)    
            treeView.append_column(column)     

PyApp() 
gtk.main()

【问题讨论】:

    标签: python gtk refresh pygtk gtktreeview


    【解决方案1】:

    我所做的更改:

    1. treeView 替换为self.treeView,以便我可以通过其他方法轻松访问它。

    2. on_activated 中,使用create_model 创建一个新模型,并将self.treeView 设置为使用gtk.TreeView.set_model 使用该模型。

    它似乎工作。代码:

    import gtk, os
    
    class PyApp(gtk.Window): 
        def __init__(self):
            super(PyApp, self).__init__()
            self.set_size_request(250, 200)
            self.set_position(gtk.WIN_POS_CENTER)
            self.connect("destroy", gtk.main_quit)
            self.set_title("SteveFM")
            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)
            store = self.create_model()
            self.treeView = gtk.TreeView(store)
            self.treeView.connect("row-activated", self.on_activated)
            self.treeView.set_rules_hint(True)
            sw.add(self.treeView)
            self.create_columns(self.treeView)        
            self.add(vbox)
            self.show_all()
    
        #  Take the names of files and subdirectories in 
        #  the current directory and sort them into a list for treeview
    
        def create_model(self):
            store = gtk.ListStore(str)
            dirList=os.listdir(os.getcwd())
            dircontents = []
            for item in dirList: 
                if item[0] != '.':
                    if os.path.isdir(item):
                        dircontents.append(['/'+item])
                    else:
                        dircontents.append([item])
            dircontents.sort() 
            for act in dircontents:
                store.append([act[0]])
            return store
    
        #  If a file is clicked, open with leafpad.
        #  If a directory is clicked, change the current working directory to it
        #  and (my hurdle) replace the current treeview list with the contents of the 
        #  new directory, just like a file manager.
    
        def on_activated(self, widget, row, col):
            model = widget.get_model()
            target = model[row][0]
            if target[0] != "/":
                cmd = "leafpad "+target
                os.system(cmd)
            else:
                os.chdir(os.getcwd()+target)
                print os.getcwd()   # Just for debugging
                self.treeView.set_model(self.create_model())
    
        def create_columns(self, treeView):
            rendererText = gtk.CellRendererText()
            column = gtk.TreeViewColumn(None, rendererText, text=0)
            column.set_sort_column_id(0)    
            self.treeView.append_column(column)     
    
    PyApp() 
    gtk.main()
    

    【讨论】:

    • 您不需要创建新模型,只需更新您正在使用的模型,然后 GtkTreeView 将自行更新视图。
    • @erick2red 我读到你的建议是正确的方法,但对如何去做感到困惑。也许杰里米的变化与“自我”有关。在 init 中将允许我再次对该方法进行故障排除。
    • 你需要创建一个函数update_model,从当前模型(gtk.ListStore.clear)中删除所有内容,然后添加新内容(类似于create_model)。然后,如果您真的想玩得开心,请对这两种方法进行基准测试,看看性能差异是什么。
    • 很好,我试试看。重新创建模型并没有表现出糟糕的性能,但对速度的一点执着总是好的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多