2016-03-07 3 views
1

У меня проблема с TreeView от GTK с ListStore. Записи обновляются, но когда-то только когда я его наводил. Большая проблема - это новые записи. Это похоже на то, что она перестает отображать новые, если я не прокручиваю все это время - это странно.Python GTK3 - 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 называются нитями (не более 30, работающих одновременно), созданных в self.module

Я проверил и новые записи правильно добавлены в ListStore - я могу читать данные из него. Окно отлично работает, но внизу нет новых предметов.

Идеи?

ответ

0

Хорошо, я провел исследование, и я понял, что GTK не нравится, когда его вызывают из-за пределов основного потока.

Был методы в ГДК для блокировки вызовов 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()) 

код не ясно, как это было раньше, но работает отлично.

+0

Вместо 'GObject вы должны использовать [' Gdk.threads_add_idle'] (http://lazka.github.io/pgi-docs/index.html#Gdk-3.0/functions.html#Gdk.threads_add_idle). timeout_add', но в остальном это правильная идея. – ptomato

Смежные вопросы