python - gtk树视图 - 可实时更新的列表存储

1 投票
1 回答
2756 浏览
提问于 2025-04-16 00:20

我在使用树形视图(treeview)和列表存储(liststore)时遇到了一些问题,想要实现实时更新。我做了一个示例来模拟我想要的效果。

我希望列表存储(liststore1)在每次循环时都能更新。

http://img204.imageshack.us/i/capturadetela5.png/

它应该每秒更新一次树形视图中的“速度”这一列,并给它一个不同的数字,类似于下载管理器的效果。

import gtk
import gtk.glade
import random

builder = gtk.Builder()
builder.add_from_file('ttt.glade')
window = builder.get_object('window1')
treeview  = builder.get_object('treeview1')
store = builder.get_object('liststore1')
column_n = ['File','Size','Speed']
rendererText = gtk.CellRendererText()


for i in range(10):
    foo = random.randint(100,256)
    list_ =  [('arquivo1.tar.gz', '10MB', '%s k/s' % foo)]

for x,y in zip(column_n,range(3)):

    column = gtk.TreeViewColumn(x, rendererText, text=y)
    column.set_sort_column_id(0)    
    treeview.append_column(column)


for list_index in list_:
    store.append([list_index[0],list_index[1],list_index[2]])

window.show_all()

1 个回答

2

如果这是你的完整代码,那你缺少了GTK主循环的调用。

你需要做两件事(按这个顺序)

1 - 把你窗口的 destroy 信号连接到一个函数,这个函数会调用 gtk.main_quit()

def on_destroy(widget, user_data=None):
    # Exit the app
    gtk.main_quit()

window.connect('destroy', on_destroy)

2 - 启动GTK主循环:

gtk.main()

在这里,你的应用程序实际上是启动的,直到调用 gtk.main_quit() 之前,它会在这一行停住。

更一般来说……你应该稍微整理一下代码 :) 可以看看 “Hello World”示例,这是来自 PyGTK教程 的,它基本上更详细地涵盖了这些要点。你会发现,遵循他们的一般结构会大有帮助。

如果你想要定时更新,可以看看 timeout_addtimeout_add_seconds 这两个函数——根据你使用的PyGTK/PyGobject的版本,它们会在 glibgobject 模块中。

(顺便提一下,GTKBuilder的XML文件通常有 .ui 的扩展名,尽管Glade并不知道这一点。)

撰写回答