Hallo zusammen
Poste hier den Code, mit dem ich arbeite, damit man nicht erst den ganzen Thread bis zum Ergebnis lesen muß.
terminal.py
Code: Alles auswählen
#!/usr/bin/env python
# coding: UTF-8
import sys
import tkinter.messagebox
try:
#~~ For Python 2.x
import Queue as qu
import Tkinter as tk
except ImportError:
#~~ For Python 3.x
import queue as qu
import tkinter as tk
class TeeStd(object):
def __init__(self, queue, type):
self.queue = queue
if type == 'stderr':
self.std_obj = sys.stderr
sys.stderr = self
else:
self.std_obj = sys.stdout
sys.stdout = self
def write(self, data):
# Ausgabe auf Tk-Textbox
self.queue.put(data)
APP_WIN_XPOS = 170
APP_WIN_YPOS = 70
class App(object):
def __init__(self, worker=None):
self.win = tk.Tk()
self.win.geometry('+{0}+{1}'.format(APP_WIN_XPOS, APP_WIN_YPOS))
self.win.protocol("WM_DELETE_WINDOW", self.close)
self.worker = worker
self.queue = qu.Queue()
self.queue_modules = qu.Queue()
self.text = tk.Text(self.win, width=120, height=20, highlightthickness=0,
bd=0, bg='white', relief='sunken', padx=5, pady=5)
self.text.pack()
self.close_button = tk.Button(self.win, text='Fenster schließen',
state='disabled', command=self.close)
self.close_button.pack()
self.win.title("My Stdout/Stderr Terminal")
# Umleitung der Standard-Ausgabe auf meine Textbox
TeeStd(self.queue, 'stderr')
TeeStd(self.queue, 'stdout')
self.sampler()
def sampler(self):
if not self.queue.empty():
data = self.queue.get_nowait()
# Please do the job
self.text.insert('end', data)
self.text.see('end')
self.queue.task_done()
if self.worker:
if not self.worker.is_alive():
self.enable_close_button()
self.win.after(50, self.sampler)
def run(self):
self.win.mainloop()
def enable_close_button(self):
self.close_button['state']="normal"
def close(self):
"""Process before shutdown"""
text = 'Möchten Sie das Terminal schließen?'
if tkinter.messagebox.askokcancel('Info', text) == True:
self.win.quit()
Auszug aus meinem Modul, in dem ich terminal.py benutze.
Code: Alles auswählen
import threading
from gui_terminal import App
from update_vendor import suppliers_data
def terminal(modul):
app = App() # redirect stdout auf Terminal-Fenster
worker = threading.Thread(target=modul)
worker.start() # macht die Arbeit in Hintergrund-Thread
app.worker = worker
app.run() # aktiviert das Terminal-Fenster
terminal(suppliers_data)
Nochmals Vielen Dank an Alle!
Grüße Nobuddy