Проблема с уничтожением классов

Есть код

 
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
  1. обратите внимание на PyQt, он значительно мощнее ткинтера
  2. возмущается лишь строка 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()
→ Ссылка