Code: Alles auswählen
t = threading.Thread(target=worker, args=(i,))
Code: Alles auswählen
t = threading.Thread(target=worker, args=(i,))
Code: Alles auswählen
import threading
import messaging
class MyApp(threading.Thread):
def __init__ (self):
self.data = None
self.event = threading.Event()
threading.Thread.__init__ (self)
def return_data(self,data):
self.data = data
self.event.set()
def get_user_data(input_mask,fill_data=None):
self.event.clear()
messaging.send('LOAD_MASK',input_mask) # implemented in the GUI for such applications - a simple implementation: destroy current content of the root window and load the root window from file
if fill_data != None: messaging.send('FILL_MASK',fill_data) # input mask specific
messaging.send('RETURN_DATA',self.return_data) # where to store this is input mask specific
self.event.wait()
return self.data
def run(self):
address = get_user_data('address_mask')
# and so on
Code: Alles auswählen
self.Queue.put((msgid,msgdata))
Code: Alles auswählen
if msgid in self.Dictionary:
receivers = self.Dictionary[msgid].items()
for receive,active in receivers:
if active: receive(msgdata)
Code: Alles auswählen
for receive,active in receivers:
if active[0]:
if active[1]: receive((msgid,msgdata))
else receive(msgdata)
Code: Alles auswählen
def _register(self,msgid,receive,packed=False):
if msgid not in self.Dictionary: self.Dictionary[msgid] = {}
self.Dictionary[msgid][receive] = [True,packed]
def do_receive(self,owner,msgid,receive,packed=False):
if not owner in self.owners: self.owners[owner] = {}
self.owners[owner][receive]=msgid
self.execute_lambda(lambda: self._register(msgid,receive,packed))
def activate_receive(self,msgid,receive,flag):
if msgid in self.Dictionary:
receivers = self.Dictionary[msgid]
if receive in receivers:
receivers[receive][0] = flag
Code: Alles auswählen
def _sendImmediate(self,msgid,msgdata=None):
while True:
if msgid in self.Dictionary:
receivers = self.Dictionary[msgid].items()
self.counter += 1
for receive,active in receivers:
if active[0]:
if active[1]: receive((msgid,msgdata))
else receive(msgdata)
self.counter -= 1
if self.counter > 0: return
if self.Queue.empty(): return
data = self.Queue.get()
msgid = data[0]
msgdata = data[1]
def _send(self,*args):
try:
data = self.Queue.get()
msgid = data[0]
msgdata = data[1]
if msgid in self.Dictionary:
receivers = self.Dictionary[msgid].items()
for receive,active in receivers:
if active[0]:
if active[1]: receive((msgid,msgdata))
else receive(msgdata)
except: print("sendQeue error")
Code: Alles auswählen
def receive_packed(self,message):
self.Queue.put(message)
self.event.set()
Code: Alles auswählen
def receive_packed(message):
self.Queue.put(message)
self.event.set()
Code: Alles auswählen
def receive_packed(message):
self.Queue.put(message)
if _mainloop_started: self.app.event_generate("<<SEND>>", when="tail")
else: self.event.set()
Code: Alles auswählen
import threading
import proxy
class Register_Callbacks(threading.Thread)
def __init__ (self, execute_lambda):
self.proxy = proxy.MessageProxy()
threading.Thread.__init__ (self)
def send(self,msgid,message=None): self.proxy.send(msgid,message)
def do_receive(self,owner,msgid,receive,packed=False): self.proxy.execute_lambda_highprio(lambda ow=owner,mid=msgid,rec=receive,pack=packed:self.proxy.do_receive(ow,mid,rec,pack))
def undo_receiveAll(self,owner): self.proxy.execute_lambda_highprio(lambda ow=owner:self.proxy.undo_receiveAll(ow))
def run(self): self.proxy.loop()
central_callbacks = Register_Callbacks()
central_callbacks.start()
Code: Alles auswählen
def receive_packed(message):
self.Queue.put(message)
if _mainloop_started: self.app.event_generate("<<SEND>>", when="tail")
Gibt es kein Zusatzpaket, welches genau das macht?snafu hat geschrieben:Das hatte ich wohl verdrängt. Wäre ja zu schön, wenn TKinter in Python ein vollwertiges Event-System hätte...BlackJack hat geschrieben:@snafu: `Tkinter`\s benutzerdefinierte Ereignisse haben allerdings den Nachteil das man keine Daten damit übermitteln kann.
Code: Alles auswählen
import threading
import extern_proxy
class MyThread(threading.Thread):
def run(self):
while True:
frage = input("> ")
extern_proxy.proxy.send("FRAGE",frage)
mythread = MyThread()
mythread.daemon = True
mythread.start()
Code: Alles auswählen
import threading
import extern_proxy
import proxy
class MyThread(threading.Thread):
def run(self):
self.proxy = proxy.Proxy(extern_proxy.proxy)
self.proxy.do_receive(self,"FRAGE_ANTWORT",lambda msg: print("Frage:",msg[0],"- Antwort:",msg[1]))
self.proxy.do_receive_extern(("FRAGE_ANTWORT",))
self.proxy.loop()
mythread = MyThread()
mythread.daemon = True
mythread.start()
Code: Alles auswählen
self.proxy = proxy.Proxy(extern_proxy.proxy)
Code: Alles auswählen
self.proxy.do_receive(self,"FRAGE_ANTWORT",lambda msg: print("Frage:",msg[0],"- Antwort:",msg[1]))
Code: Alles auswählen
self.proxy.do_receive_extern(("FRAGE_ANTWORT",))
Code: Alles auswählen
import frage
import frage_antwort
import extern_proxy
import proxy as myproxy
import tkinter as tk
proxy = myproxy.Proxy(extern_proxy.proxy)
# external message callbacks
proxy.do_receive_extern(("FRAGE",))
proxy.do_send_extern(("FRAGE_ANTWORT",))
root = tk.Tk()
frage = tk.Label()
frage.pack()
antwort = tk.Entry()
antwort.pack()
def get_frage(msg):
frage['text'] = msg
antwort.delete(0,'end')
# internal callbacks
proxy.do_receive(root,"FRAGE",get_frage)
antwort.bind("<Return>",lambda event: proxy.send('FRAGE_ANTWORT',(frage['text'],antwort.get())))
# tk trigger for proxy
root.bind("<<SEND>>",proxy.work)
proxy.set_trigger(lambda: root.event_generate("<<SEND>>", when="tail"))
root.mainloop()
Code: Alles auswählen
proxy.do_receive_extern(("FRAGE",))
proxy.do_send_extern(("FRAGE_ANTWORT",))
Code: Alles auswählen
proxy.do_receive(root,"FRAGE",get_frage)
antwort.bind("<Return>",lambda event: proxy.send('FRAGE_ANTWORT',(frage['text'],antwort.get())))
Code: Alles auswählen
# tk trigger fror proxy
root.bind("<<SEND>>",proxy.work)
proxy.set_trigger(lambda: root.event_generate("<<SEND>>", when="tail"))
Code: Alles auswählen
import threading
import proxy as myproxy
proxy = None
class MyThread(threading.Thread):
def run(self):
global proxy
self.proxy = myproxy.Proxy()
proxy=self.proxy
self.proxy.loop()
mythread = MyThread()
mythread.daemon = True
mythread.start()
Code: Alles auswählen
import queue
import threading
class Proxy:
def __init__(self,extern_proxy=None):
if extern_proxy == None: self.extern_proxy = self
else: self.extern_proxy = extern_proxy
self.reset()
def noop(self): pass
def reset(self):
self.Dictionary = {}
self.owners = {}
self.Queue = queue.Queue()
self.Queue_HighPrio = queue.Queue()
self._register("execute_function",lambda msg: msg())
self.running = False
self.trigger = self.do_work
self.extern_trigger = self.noop
def set_trigger(self,trigger):
self.trigger = trigger
self.extern_trigger = trigger
def do_work(self):
if self.running: return
self.running = True
while self.work(): pass
self.running = False
def loop(self):
self.event = threading.Event()
self.set_trigger(self.event.set)
self.trigger()
while True:
self.event.wait()
while self.work(): pass
def work(self,*args):
if not self.Queue_HighPrio.empty(): data = self.Queue_HighPrio.get()
elif not self.Queue.empty(): data = self.Queue.get()
else: return False
msgid = data[0]
msgdata = data[1]
if msgid in self.Dictionary:
receivers = self.Dictionary[msgid].items()
for receive,packed in receivers:
if packed: receive((msgid,msgdata))
else: receive(msgdata)
return True
# sending ==========================================================
def send(self,msgid,msgdata=None):
self.Queue.put((msgid,msgdata))
self.trigger()
# extern send and receive callbacks ==========================================
def do_send_extern(self,message_ids):
for mid in message_ids: self.do_receive(self,mid,self.send_extern,True)
def send_extern(self,message): self.extern_proxy.send(message[0],message[1])
def do_receive_extern(self,message_ids):
for mid in message_ids: self.extern_proxy.do_receive(self,mid,self.receive_extern,True)
def receive_extern(self,message):
self.Queue.put(message)
self.extern_trigger()
# register receiver ================================================
def do_receive(self,owner,msgid,receive,packed=False):
self.Queue_HighPrio.put(("execute_function",lambda: self._do_receive(owner,msgid,receive,packed)))
self.trigger()
def _do_receive(self,owner,msgid,receive,packed):
if not owner in self.owners: self.owners[owner] = {}
self.owners[owner][receive]=msgid
self._register(msgid,receive,packed)
def _register(self,msgid,receive,packed=False):
if msgid not in self.Dictionary: self.Dictionary[msgid] = {}
self.Dictionary[msgid][receive] = packed
# unregister receiver ================================================
def undo_receive(self,owner,msgid,receive):
self.Queue_HighPrio.put(("execute_function",lambda: self._undo_receive(owner,msgid,receive)))
self.trigger()
def _undo_receive(self,owner,msgid,receive):
if owner in self.owners:
if receive in self.owners[owner]: del self.owners[owner][receive]
self._unregister1(msgid,receive)
def _unregister1(self,msgid,receive):
if msgid in self.Dictionary:
receivers = self.Dictionary[msgid]
if receive in receivers:
del receivers[receive]
if len(receivers) == 0: del self.Dictionary[msgid]
# unregister Owner ================================================
def undo_receiveAll(self,owner):
self.Queue_HighPrio.put(("execute_function",lambda: self._undo_receiveAll(owner)))
self.trigger()
def _undo_receiveAll(self,owner):
if owner in self.owners:
messages = self.owners[owner]
del self.owners[owner]
for receive,msgid in messages.items(): self._unregister1(msgid,receive)
Das ist nur allzu menschlich. Jeder von uns hat blinde Flecke mit nahezu null Ahnung. Das ist nicht schlimm. Viel gefährlicher ist Halbwissen. Es verleitet uns immer wieder, Dinge zu behaupten und zu tun, wo sich der gesunde Menschverstand an den Kopf fassen möchte.Alfons Mittelmeyer hat geschrieben:Irgendwo scheint Ihr wohl nichts zu kapieren.