Python GTK3 - TreeView未正确更新

时间:2016-03-07 20:03:23

标签: python multithreading treeview gtk3

我在使用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中 - 我可以从中读取数据。窗口工作正常,但底部没有新项目。

想法?

1 个答案:

答案 0 :(得分:0)

好的,我做了研究,我发现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())

代码并不像以前那样清晰,但效果很好。