Python GTK3 - TreeView 未正确更新

Python GTK3 - TreeView not being updated properly

我对带有 ListStore 的 GTK TreeView 有疑问。记录会更新,但有时只有当我将其悬停时才会更新。 更大的问题是新记录 - 就像它停止显示新记录,除非我一直滚动到底部 - 这很奇怪。

我使用 Glade。 我的代码(稍微简化)

class UI(SampleUI):
  gladefile = 'ui.glade'
  iterdict = {}

  def __init__(self, module):
    super().__init__(module)

  def start(self):
    self.fetch_widgets()
    self.connect_events()
    self.window.show()

  def fetch_widgets(self):
    self.window = self.builder.get_object('window')
    self.liststore = self.builder.get_object('store')

  def connect_events(self):
    handlers = {
        "on_window_close"  : Gtk.main_quit,
        "on_start_working": self.start_working,
        "on_stop_working": self.stop_working
    }
    self.builder.connect_signals(handlers)

    self.module.url_pending_action = self.url_pending
    self.module.url_succeed_action = self.url_update

  def start_working(self, button):
    self.module.start()

  def stop_stop(self, button):
    self.module.stop()

  def url_pending(self, data):
    self.iterdict[data['url']] = self.liststore.append([0, data['url'], 0, '', data['text']])

  def url_update(self, data):
    _iter = self.iterdict[data['url']]
    self.liststore[_iter][1] = data['some_field1']
    self.liststore[_iter][2] = data['some_field2']

方法self.url_pending和self.url_update被self.module

中创建的线程调用(最多同时30个运行)

我检查过新记录已正确附加到 ListStore - 我可以从中读取数据。 Window 工作正常,但底部没有新项目。

想法?

好的,我进行了研究,发现 GTK 不喜欢从主线程外部调用。

Gdk 中有锁定 GTK 调用的方法

Gtk.threads_enter()
...
Gtk.threads_leave()

但现在它已被弃用,GTK 文档说每个 GTK 调用都应该在主线程中。

我的解决方法:

# [...]

def start(self):
  # [...]
  GObject.timeout_add(100, self.query_do)

# [...]

def query_do(self):
  while len(self.gtk_calls):
    self.gtk_calls.pop()()
  GObject.timeout_add(100, self.query_do)

我只是添加到查询中

self.gtk_calls.insert(0, lambda: anything())

代码不像以前那样清晰,但运行完美。