dec = decodeAddrHeader(addr) # i18n(1) -> str enc = encodeAddrHeader(dec) # str -> i18n(2) rec = decodeAddrHeader(enc) # i18n(2) -> str t.insert('end', addr + '\n') t.insert('end', dec + '\n') t.insert('end', enc + '\n') t.insert('end', rec + '\n') t.insert('end', 'encoded: ' + ('same' if enc == addr else 'differs') + '\n') t.insert('end', 'decoded: ' + ('same' if rec == dec else '**differs**') + '\n\n') t.insert('end', '\n' + '-' * 100 + '\n\n') t.insert('end', '[test encoding addrs, multi/mixed addrs\n\n') for (ix, addr) in enumerate(addrs): # multi addrs, mix encooding addr += ', ' + (addr if ix == 0 else addrs[ix - 1]) dec = decodeAddrHeader(addr) # i18n(1) -> str enc = encodeAddrHeader(dec) # str -> i18n(2) rec = decodeAddrHeader(enc) # i18n(2) -> str t.insert('end', addr + '\n') t.insert('end', dec + '\n') t.insert('end', enc + '\n') t.insert('end', rec + '\n') t.insert('end', 'encoded: ' + ('same' if enc == addr else 'differs') + '\n') t.insert('end', 'decoded: ' + ('same' if rec == dec else '**differs**') + '\n\n') t.pack() t.mainloop()
dataQueue = queue.Queue() def producer(id): for i in range(5): time.sleep(0.1) print('put') dataQueue.put('[producer id=%d, count=%d]' %(id, i)) def consumer(root): try: print('get') data = dataQueue.get(block=False) except queue.Empty: pass else: root.insert('end', 'consumer got => %s\n' % str(data)) root.see('end') root.after(250, lambda: consumer(root)) def makethreads(): for i in range(4): _thread.start_new_thread(producer, (i,)) if __name__ == '__main__': from tkinter.scrolledtext import ScrolledText root = ScrolledText() root.pack() root.bind('<Button-1>', lambda event: makethreads()) consumer(root) root.mainloop()
time.sleep(0.1) print('put') dataQueue.put('[producer id=%d, count=%d]' % (id, i)) def consumer(root): try: print('get') data = dataQueue.get(block=False) except queue.Empty: pass else: root.insert('end', 'consumer got => %s\n' % str(data)) root.see('end') root.after(250, lambda: consumer(root)) # 4 times per sec def makethreads(): for i in range(4): _thread.start_new_thread(producer, (i, )) if __name__ == '__main__': # main GUI thread: spawn batch of worker threads on each mouse click from tkinter.scrolledtext import ScrolledText root = ScrolledText() root.pack() root.bind('<Button-1>', lambda event: makethreads()) consumer(root) # start queue check loop in main thread root.mainloop() # pop-up window, enter tk event loop
dataQueue = queue.Queue() def producer(id): for i in range(5): time.sleep(0.1) print('put') dataQueue.put('[producer id=%d, count=%d]' % (id, i)) def consumer(root): try: print('get') data = dataQueue.get(block=False) except queue.Empty: pass else: root.insert('end', 'consumer got => %s\n' % str(data)) root.see('end') root.after(250, lambda: consumer(root)) def makethreads(): for i in range(4): _thread.start_new_thread(producer, (i,)) if __name__ == '__main__': from tkinter.scrolledtext import ScrolledText root = ScrolledText() root.pack() root.bind('<Button-1>', lambda event: makethreads()) consumer(root) root.mainloop()
t.insert('end', '[test encoding addrs, and decoding back again (sends + later recvs)]\n\n') for addr in addrs: dec = decodeAddrHeader(addr) # i18n(1) -> str enc = encodeAddrHeader(dec) # str -> i18n(2) rec = decodeAddrHeader(enc) # i18n(2) -> str t.insert('end', addr + '\n') t.insert('end', dec + '\n') t.insert('end', enc + '\n') t.insert('end', rec + '\n') t.insert('end', 'encoded: ' + ('same' if enc == addr else 'differs') + '\n') t.insert('end', 'decoded: ' + ('same' if rec == dec else '**differs**') + '\n\n') t.insert('end', '\n' + '-'*100 + '\n\n') t.insert('end', '[test encoding addrs, multi/mixed addrs\n\n') for (ix, addr) in enumerate(addrs): # multi addrs, mix encooding addr += ', ' + (addr if ix == 0 else addrs[ix-1]) dec = decodeAddrHeader(addr) # i18n(1) -> str enc = encodeAddrHeader(dec) # str -> i18n(2) rec = decodeAddrHeader(enc) # i18n(2) -> str t.insert('end', addr + '\n') t.insert('end', dec + '\n') t.insert('end', enc + '\n') t.insert('end', rec + '\n') t.insert('end', 'encoded: ' + ('same' if enc == addr else 'differs') + '\n') t.insert('end', 'decoded: ' + ('same' if rec == dec else '**differs**') + '\n\n') t.pack() t.mainloop()
#!/usr/bin/env python3 # -*- coding: UTF-8 -*- '''极简模式''' from tkinter.scrolledtext import ScrolledText txt = ScrolledText() txt.pack(fill='both', side='left', expand=True) txt.mainloop()
# thread's main action def threadaction(id, reps, progress): # what the thread does for i in range(reps): time.sleep(1) if progress: progress(i) # progress callback: queued if id % 2 == 1: raise Exception # odd numbered: fail # thread exit/progress callbacks: dispatched off queue in main thread def threadexit(myname): text.insert('end', '%s\texit\n' % myname) text.see('end') def threadfail(exc_info, myname): text.insert('end', '%s\tfail\t%s\n' % (myname, exc_info[0])) text.see('end') def threadprogress(count, myname): text.insert('end', '%s\tprog\t%s\n' % (myname, count)) text.see('end') text.update() # works here: run in main thread # make enclosing GUI and start timer loop in main thread # spawn batch of worker threads on each mouse click: may overlap text = ScrolledText() text.pack() threadChecker(text) # start thread loop in main thread text.bind('<Button-1>', # 3.x need list for map, range ok lambda event: list(map(onEvent, range(6))) ) text.mainloop() # pop-up window, enter tk event loop
context=(myname, ), onExit=threadexit, onFail=threadfail, onProgress=threadprogress) def threadaction(id, reps, progress): for i in range(reps): time.sleep(1) if progress: progress(i) if id % 2 == 1: raise Exception def threadexit(myname): text.insert('end', '%s\ttext\n' % myname) text.see('end') def threadfail(exc_info, myname): text.insert('end', '%s\tfail\t%s\n' % (myname, exc_info[0])) text.see('end') def threadprogress(count, myname): text.insert('end', '%s\tprog\t%s\n' % (myname, count)) text.see('end') text.update() text = ScrolledText() text.pack() threadChecker(text) text.bind('<Button-1>', lambda event: list(map(onEvent, range(6)))) text.mainloop()
def onEvent(i): myname = 'thread-%s' % i startThread(action=threadaction, args=(i, 3), context=(myname, ), onExit=threadexit, onFail=threadfail, onProgress=threadprogress) def threadaction(id, reps, progress): for i in range(reps): time.sleep(1) if progress: progress(i) if id % 2 == 1: raise Exception def threadexit(myname): text.insert('end', '%s\texit\n' % myname) text.see('end') def threadfail(exc_info, myname): text.insert('end', '%s\tfail\t%s\n' % (myname, exc_info[0])) text.see('end') def threadprogress(count, myname): text.insert('end', '%s\tprog\t%s\n' % (myname, count)) text.see('end') text.update() text=ScrolledText() text.pack() threadChecker(text) text.bind('<Button-1>', lambda event: list(map(onEvent, range(6)))) text.mainloop()
time.sleep(0.1) print('put') dataQueue.put('[producer id=%d, count=%d]' % (id, i)) def consumer(root): try: print('get') data = dataQueue.get(block=False) except queue.Empty: pass else: root.insert('end', 'consumer got => %s\n' % str(data)) root.see('end') root.after(250, lambda: consumer(root)) # 4 раза в секунду def makethreads(): for i in range(4): _thread.start_new_thread(producer, (i, )) if __name__ == '__main__': # главный поток: порождает группу рабочих потоков на каждый щелчок мыши from tkinter.scrolledtext import ScrolledText root = ScrolledText() root.pack() root.bind('<Button-1>', lambda event: makethreads()) consumer(root) # запустить цикл проверки очереди в главном потоке окна root.mainloop() # вход в цикл событий
def producer(id): for i in range(5): time.sleep(0.1) print('put') dataQueue.put('[producer id=%d, count=%d]' % (id, i)) def consumer(root): try: print('get') data = dataQueue.get(block=False) except queue.Empty: pass else: root.insert('end', 'consumer got => %s\n' % str(data)) root.see('end') root.after(250, lambda: consumer(root)) # 4 times per sec def makethreads(): for i in range(4): _thread.start_new_thread(producer, (i,)) if __name__ == '__main__': # main GUI thread: spawn batch of worker threads on each mouse click from tkinter.scrolledtext import ScrolledText root = ScrolledText() root.pack() root.bind('<Button-1>', lambda event: makethreads()) consumer(root) # start queue check loop in main thread root.mainloop() # pop-up window, enter tk event loop
if progress: progress(i) # обработчик progressЖ: в очередь if id % 2 == 1: raise Exception # ошибочный номер: неудача # обработчики завершения/информирования о ходе выполнения задания: # передаются главному потоку через очередь def threadexit(myname): text.insert('end', '%s\texit\tn' % myname) text.see('end') def threadfail(exc_info, myname): text.insert('end', '%s\tfail\t%s\n' % (myname, exc_info[0])) text.see('end') def threadprogress(count, myname): text.insert('end', '%s\tprog\t%s\n' % (myname, count)) text.see('end') text.update() # допустимо: выполняется в гл.потоке # создать графический интерфейс и запустить цикл обработки событий от # таймера в главном потоке # порождать группу рабочих потоков в ответ на каждый щелчок мышью: # выполнение их может перекрываться во времени text = ScrolledText() text.pack() threadChecker(text) # запуск цикла обработки потоков text.bind( '<Button-1>', # в 3.X list необходим для получения всех результатов lambda event: list(map(onEvent, range(6)))) # map, для range - нет text.mainloop() # вход в цикл сообщений