Откуда берётся переменная 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()

И мне захотелось узнать откуда берётся переменная msg в начале кода?

class StdoutDirector(object):
    def __init__(self, text_area):
        self.text_area = text_area

    def write(self, msg): #здесь
        self.text_area.insert(END, msg) # и здесь

Ответы (2 шт):

Автор решения: Валерий Михайлович

Это не переменная это аргумент. Вы сами должны передать его в функцию данного класса при её вызове.

→ Ссылка
Автор решения: S. Nick

я прокомментировал ваш код и заодно убрал глобальную переменную a

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.insert(1.0,                                           # +++ 
            '''print('Hello World')\nprint(2 + 3)'''                    # +++ 
        )                                                               # +++ 
        
        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, args = (a,))                    # +++ , args = (a,)
        sys.stdout = StdoutDirector(self.text_area)
        
        
        # configure the nameless "root" logger to also write           
        # to the redirected sys.stdout                                 
        logger = logging.getLogger()                                   
        console = logging.StreamHandler(stream=sys.stdout)             
        logger.addHandler(console)                                     
        t.start()

def print_stuff(a):                                                    # +++ (a)
    logger = logging.getLogger('print_stuff')      

    #                      откуда берётся переменная msg в начале кода?
    print("start project")                                            # отсюда ===============> 
    #                      откуда берётся переменная msg в начале кода?
    exec(a)                                                            # и отсюда ===============> 

def main():
    logging.basicConfig(level=logging.INFO) 
    root = Tk()
    app = App(root)
    root.mainloop()

if __name__=='__main__':
    main()

введите сюда описание изображения

→ Ссылка