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()