我在使用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中 - 我可以从中读取数据。窗口工作正常,但底部没有新项目。
想法?
答案 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())
代码并不像以前那样清晰,但效果很好。