GTK+ 3 and Threading
Verfasst: Donnerstag 14. Februar 2013, 11:56
Hi folks,
Das hier ist wahrscheinlich eher ein generelles Problem, aber es hat mit GTK+ zu tun, weshalb ich es mal hier rein verfrachte. Ich bin gerade dabei mein ProgressBar Widget zum laufen zu bringen. Dafür habe ich den code in diesem link von pygtk auf GTK+ 3 umgeschrieben (siehe unten). Das klappt auch wunderbar.
Jetzt möchte ich aber, dass mein WorkerThread auch Argumente annehmen kann. Am besten wäre eine Variable Anzahl, so dass ich nicht für jede Anzahl von Argumenten eine neue WorkerThread Klasse schreiben muss. Ich stelle mir etwas wie zum Beispiel folgendes vor.
Was dann eine Funktion aufruft, die ungefähr folgendermaßen aussehen würde:
Hat da irgendjemand eine Ahnung, wie man das verwirklichen könnte? Ich bin für jeden Hinweis dankbar, denn die Versuche der letzten tage haben eindeutig gezeigt, dass ich keine Ahnung habe, wie man das anstellen könnte
Danke schonmal für Eure Hilfe. Falls ich mich schlecht ausgedrückt habe, dann bitte ich um Entschuldigung und werde versuchen es besser zu erklären.
Das hier ist wahrscheinlich eher ein generelles Problem, aber es hat mit GTK+ zu tun, weshalb ich es mal hier rein verfrachte. Ich bin gerade dabei mein ProgressBar Widget zum laufen zu bringen. Dafür habe ich den code in diesem link von pygtk auf GTK+ 3 umgeschrieben (siehe unten). Das klappt auch wunderbar.
Jetzt möchte ich aber, dass mein WorkerThread auch Argumente annehmen kann. Am besten wäre eine Variable Anzahl, so dass ich nicht für jede Anzahl von Argumenten eine neue WorkerThread Klasse schreiben muss. Ich stelle mir etwas wie zum Beispiel folgendes vor.
Code: Alles auswählen
wt = WorkerThread(self, self.work, arg1, arg2,... argX)
Code: Alles auswählen
def work(self, *args):

Code: Alles auswählen
import threading
import random, time
from gi.repository import Gtk, GObject
class MainThread:
def __init__(self):
GObject.threads_init()
self.fs = None
def main_quit(self, obj):
if not self.fs == None: self.fs.stop()
Gtk.main_quit()
def pulse(self):
self.progressbar.pulse()
return self.still_working # 1 = repeat, 0 = stop
def work(self): ###### This would be the actual time-consuming workload
time.sleep(200)
def main(self):
window = Gtk.Window()
vbox = Gtk.VBox()
self.progressbar = Gtk.ProgressBar()
vbox.pack_start(self.progressbar, True, True, 0)
window.add(vbox)
window.show_all()
window.connect('destroy', self.main_quit)
wt = WorkerThread(self.work, self)
wt.start()
GObject.timeout_add(100, self.pulse)
Gtk.main()
class WorkerThread(threading.Thread):
def __init__ (self, function, parent):
threading.Thread.__init__(self)
self.function = function
self.parent = parent
def run(self): # when does "run" get executed?
self.parent.still_working = True
self.function()
self.parent.still_working = False
def stop(self):
self = None
if __name__ == '__main__':
mt = MainThread()
mt.main()