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())
代码不像以前那样清晰,但运行完美。
我对带有 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())
代码不像以前那样清晰,但运行完美。