Seite 2 von 2
Verfasst: Freitag 21. März 2008, 22:32
von Treehouse
Also so meinst du das nun hoffe ich....
Code: Alles auswählen
def on_search(self, data):
text = self.search_entry.get_text()
self.aur.clear_information()
self.aur.search(text)
gobject.idle_add(self.after_search)
def after_search(self):
gobject.timeout_add(100, self.bar_searching)
if self.aur.is_package():
self.on_information()
else:
self.no_pack_dialog()
Ich will keine GUI Funktionen in der Klasse für Suchverwaltung haben. Ich trenne meine Programme immer nach GUI und funktionalität. So kann ich immer mehr oder weniger schnell das Toolkit wechseln.
Aber ich hätte nie gedacht das ein so kleines Feature so viel Aufwand sein kann.
Verfasst: Samstag 22. März 2008, 22:27
von Trundle
Treehouse hat geschrieben:Also so meinst du das nun hoffe ich....
Vermutlich nicht.. damit setzt du die ProgressBar ja erst auf pulsierend, wenn die Suche bereits um ist.
Angenommen, `self.aur.search` ist deine Suchfunktion, die etwas länger zum Suchen braucht, dann würde ich das vermutlich so irgendwie lösen:
Code: Alles auswählen
from threading import Thread
def on_search(self, data):
text = self.search_entry.get_text()
self.aur.clear_information()
search = Thread(target=self.aur.search, args=[text])
search.start()
self.progressbar.set_text('Searching...')
gobject.timeout_add(100, self.bar_searching, search)
def bar_searching(self, search):
self.progressbar.pulse()
if search.isAlive():
return True
else:
if self.aur.is_package():
self.on_information()
else:
self.no_pack_dialog()
Verfasst: Sonntag 23. März 2008, 11:05
von Treehouse
Hallo Trundle,
danke das du dir nochmal die Mühe gemacht hast mir den Sachverhalt zu erklären. Ich bin gestern morgen auf die Lösung gekommen. Hatte aber bis jetzt leider noch keine Gelegenheit dir das mit zuteilen (kennst ja vielleicht diesen Osterwahn

).
Ich verwende jetzt doch einen Thread aber ich habe eine after_search Methode eingebaut, die auch noch als Wahrheitsabfrage beim lambda mit rein kommt.
Hier mal die Lösung meines Problems
Code: Alles auswählen
def on_search(self, data):
text = self.search_entry.get_text()
self.aur.clear_information()
search = Thread(target=self.aur.search, args=[text])
search.start()
self.rider = gobject.timeout_add(100, lambda:self.bar_searching() or search.isAlive() or self.after_search())
def after_search(self):
if self.aur.is_package():
self.on_information()
else:
self.no_pack_dialog()
self.bar_done()
gobject.source_remove(self.rider)
So funktionierts jetzt einwandfrei.
Ich danke dir nochmal vielmals für deine Mühe mir die Dinge zu erklären. Aber manchmal hat man einfach ein Problem in das man sich verrennt, wo man den Wald vor lauter Bäumen nicht sieht.
Gruß
Treehouse
Verfasst: Sonntag 23. März 2008, 11:49
von Trundle
Wobei man das Timeout-Event nicht unbedingt explizit entfernen muss, da `after_search` `None` zurückgibt und das lambda somit None zurückgibt, was dazu führt, dass das Timeout automatisch entfernt wird.