Проблема с уничтожением классов
Есть код
from tkinter import *
import logging
from threading import Thread
class IODirector(object):
def __init__(self, text_area):
self.text_area = text_area
a=('''print("&&&")''')
class StdoutDirector(IODirector):
def write(self, msg):
self.text_area.insert(END, msg)
def flush(self):
pass
class App(Frame):
def __init__(self, master):
self.master = master
Frame.__init__(self, master, relief=SUNKEN, bd=2)
self.start()
def start(self):
print (msg)
self.master.title("Test")
self.submit = Button(self.master, text='Run', command=self.do_run, fg="red")
self.submit.pack(side=TOP)
self.text=Text(self.master)
self.text.pack(fill=BOTH)
self.text_area = Text(self.master, height=10, bg='black',fg="white")
self.text_area.pack(side=BOTTOM,fill=X)
def do_run(self):
global a
a=self.text.get(1.0, END)
self.text_area.delete(1.0, END)
t = Thread(target=print_stuff)
sys.stdout = StdoutDirector(self.text_area)
# configure the nameless "root" logger to also write # added
# to the redirected sys.stdout # add
logger = logging.getLogger() # added
console = logging.StreamHandler(stream=sys.stdout) # added
logger.addHandler(console) # added
t.start()
def print_stuff():
logger = logging.getLogger('print_stuff') # will inherit "root" logger settings
print("start project")
exec(a)
def main():
logging.basicConfig(level=logging.INFO) # enable logging # added
root = Tk()
app = App(root)
root.mainloop()
if __name__=='__main__':
main()
Поскольку я ничего не понимаю в ООП пришлось избавиться от классов:
from tkinter import *
import logging
from threading import Thread
import sys
root=Tk()
a=('''print("&&&")''')
def write():
text_area.insert(END, msg)
def flush():
pass
def print_stuff():
logger = logging.getLogger('print_stuff') # will inherit "root" logger settings
print("start project") # changed
exec(a)
def do_run():
global a, t
a=add.get(1.0, END)
text_area.delete(1.0, END)
t = Thread(target=print_stuff)
sys.stdout = StdoutDirector(text_area) # configure the nameless "root" logger to also write # added
# to the redirected sys.stdout # add
logger = logging.getLogger() # added
console = logging.StreamHandler(stream=sys.stdout) # added
logger.addHandler(console) # added
t.start()
root.title("Test")
submit = Button(root, text='Run', command=do_run, fg="red")
submit.pack(side=TOP)
add=Text(root)
add.pack(fill=BOTH)
text_area = Text(root, height=10, bg='black',fg="white")
text_area.pack(side=BOTTOM,fill=X)
root.mainloop()
Но получилось мягко говоря не очень и код не заработал. Сразу скажу что проблема была в переменной msg .
Ответы (1 шт):
Автор решения: user402610
→ Ссылка
- обратите внимание на PyQt, он значительно мощнее ткинтера
- возмущается лишь строка print(msg) у меня все неплохо работает, но с двойными кавычками не работает, нужны одинарные. в начале нет смысла прлодить классы, которые создаются как основа для нового класса.
from tkinter import *
import logging
from threading import Thread
a=('''print("&&&")''')
class StdoutDirector(object):
def __init__(self, text_area):
self.text_area = text_area
def write(self, msg):
self.text_area.insert(END, msg)
class App(Frame):
def __init__(self, master):
self.master = master
Frame.__init__(self, master, relief=SUNKEN, bd=2)
self.start()
def start(self):
self.master.title("Test")
self.submit = Button(self.master, text='Run', command=self.do_run, fg="red")
self.submit.pack(side=TOP)
self.text=Text(self.master)
self.text.pack(fill=BOTH)
self.text_area = Text(self.master, height=10, bg='black',fg="white")
self.text_area.pack(side=BOTTOM,fill=X)
def do_run(self):
global a
a=self.text.get(1.0, END)
self.text_area.delete(1.0, END)
t = Thread(target=print_stuff)
sys.stdout = StdoutDirector(self.text_area)
# configure the nameless "root" logger to also write # added
# to the redirected sys.stdout # add
logger = logging.getLogger() # added
console = logging.StreamHandler(stream=sys.stdout) # added
logger.addHandler(console) # added
t.start()
def print_stuff():
logger = logging.getLogger('print_stuff') # will inherit "root" logger settings
print("start project")
exec(a)
def main():
logging.basicConfig(level=logging.INFO) # enable logging # added
root = Tk()
app = App(root)
root.mainloop()
if __name__=='__main__':
main()