GTK Python更新树视图

GTK Python更新树视图,python,python-3.x,treeview,gtk,gtk3,Python,Python 3.x,Treeview,Gtk,Gtk3,我有一个由Python 3.8代码调用的GTK3 GUI。GUI上添加了一个treeview。我想每1秒更新一次treeview,但是它占用了太多的CPU资源,并且在大约10秒后崩溃。当我使用较小的数据时。当使用较大的数据(250行)时,会立即出现错误: Backend terminated or disconnected. Use 'Stop/Restart' to restart. 高效更新数据的解决方案是什么 代码示例: import gi gi.require_version('Gtk

我有一个由Python 3.8代码调用的GTK3 GUI。GUI上添加了一个treeview。我想每1秒更新一次treeview,但是它占用了太多的CPU资源,并且在大约10秒后崩溃。当我使用较小的数据时。当使用较大的数据(250行)时,会立即出现错误:

Backend terminated or disconnected. Use 'Stop/Restart' to restart.
高效更新数据的解决方案是什么

代码示例:

import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk

builder = Gtk.Builder()
builder.add_from_file('example.glade')
builder.get_objects()
window1 = builder.get_object('window1')

class Signals:
    def on_window1_destroy(self, widget):
        Gtk.main_quit()

def data_add(thread1):
    while True:
    starttime1 = time.time()
    time.sleep(1 - ((time.time() - starttime1) % 1))

    dict1 = {1: {"name": "data1", "content": "data2", "date": "data3"}, 
             2: {"name": "data4", "content": "data5", "date": "data6"},
             3: {"name": "data7", "content": "data8", "date": "data9"},
             .
             .
             .
             250: {"name": "datax", "content": "datay", "date": "dataz"}}
    .
    .
    # Dictionary data converted to list data.
    .
    .
    global initial_run
    if initial_run == 1:
        treeview1 = Gtk.TreeView()
        liststore1 = Gtk.ListStore(str, str, str, int, float)
        treeview1.set_model(liststore1)

    for i in range(0, 250):
        liststore1.append([list_data1[i], list_data2[i], list_data3[i], list_data4[i]])
            
    if initial_run == 1:
    for i, column in enumerate(process_columns):
        cell = Gtk.CellRendererText()
        col = Gtk.TreeViewColumn(column, cell, text=i)
        treeview1.append_column(col)

    treeview1.show()
    initial_run=0


thrd = threading.Thread(target=data_add, args = ("thread1", ), daemon=True)
thrd.start()

builder.connect_signals(Signals())
window1.show_all()
Gtk.main()

之所以要消耗如此多的CPU,是因为您已经实现了一个重复向
Gtk.TreeView
添加(而不是更新)250行的应用程序。另一个问题是,您正在从不同的线程调用Gtk API,这是不允许的,因为Gtk显式地不是线程安全的

要在主线程上定期执行函数(实际上是回调),可以使用API,例如。如果您确实需要在不同的线程上完成工作,那么您应该在该线程中执行操作,并调用以使用结果更新树视图


就更新treeview本身而言:对于数据集中的每一行,您首先必须在liststore中找到一个现有条目并进行更新,而不是不断地创建一个新条目。

您消耗如此多CPU的原因是,您实现了一个重复添加(而不是更新)的250行到您的
Gtk.TreeView
。另一个问题是,您正在从不同的线程调用Gtk API,这是不允许的,因为Gtk显式地不是线程安全的

要在主线程上定期执行函数(实际上是回调),可以使用API,例如。如果您确实需要在不同的线程上完成工作,那么您应该在该线程中执行操作,并调用以使用结果更新树视图


至于树视图本身的更新:对于数据集中的每一行,您必须首先在列表存储中找到一个现有条目并进行更新,而不是试图不断创建一个新条目。

您可以找到一个如何使用
GLib.timeout\u add\u seconds()的示例
此处:您可以在此处找到如何使用GLib.timeout\u add\u seconds()的示例。