Python 如何将标准输出重定向到Tkinter文本小部件

Python 如何将标准输出重定向到Tkinter文本小部件,python,python-2.7,tkinter,stdout,Python,Python 2.7,Tkinter,Stdout,我的基础程序从脚本GUI.py导入它的GUI界面 old_stdout = sys.stdout root = Tk.Tk() root.title('Coursera-dl') root.geometry("345x230") app = GUI.Interface(root) app.mainloop() if app.button_press() == True and app.return_data(): data = app.return_data()

我的基础程序从脚本GUI.py导入它的GUI界面

old_stdout = sys.stdout

root = Tk.Tk()
root.title('Coursera-dl')
root.geometry("345x230")
app = GUI.Interface(root)
app.mainloop()

if app.button_press() == True and app.return_data():
    data = app.return_data()
    main(data[0],data[1],data[2],data[3],data[4],data[5],data[6],data[7],data[8])

sys.stdout = old_stdout
在my GUI.py中:

class Interface(ttk.Frame):
    def __init__(self,parent=None):
        ttk.Frame.__init__(self,parent)
        self.parent = parent
        self.New_Window()

    def New_Window(self):
        self.newWindow = Tk.Toplevel(self.parent)
        self.app = CoreGUI(self.newWindow)


class StdoutRedirector(object):
    def __init__(self,text_widget):
        self.text_space = text_widget

    def write(self,string):
        self.text_space.insert('end', string)
        self.text_space.see('end')


class CoreGUI(object):
    def __init__(self,parent):
        self.parent = parent
        self.InitUI()

    def InitUI(self):
        self.text_box = Tk.Text(self.parent, wrap='word', height = 11, width=50)
        self.text_box.grid(column=0, row=0, columnspan = 2, sticky='NSWE', padx=5, pady=5)
        sys.stdout = StdoutRedirector(self.text_box)
但它所做的是打开两个窗口,第一个窗口(顶层窗口)按预期工作,第二个窗口处于空闲状态,这是预期的,直到我单击某个按钮,该按钮在连续按下后打印数据,打印的数据应显示在第二个窗口的文本小部件中但是这不会发生,并且程序没有响应,当我关闭顶层窗口时,会出现错误消息

Tcl错误:命令名“”33328904.33329104“”无效

那么,如何在文本窗口小部件中而不是在控制台中打印数据呢


编辑:
为了帮助您解决这个问题,我编写了一个脚本,将stdout重定向到Tkinter文本小部件,请查看它的操作:-)

问题是,当您调用
app.mainloop()
时,线程正忙于执行Tkinter mainloop,因此在退出循环之前不会执行它之前的语句。但一旦退出主循环,您就尝试使用文本小部件,但它已经被销毁

我建议您将对
main
的调用移动到Tkinter小部件的回调中(我想您已经在尝试使用
app.button\u press()
),这样文本对象就可以用来显示文本

class CoreGUI(object):
    def __init__(self,parent):
        self.parent = parent
        self.InitUI()
        button = Button(self.parent, text="Start", command=self.main)
        button.grid(column=0, row=1, columnspan=2)

    def main(self):
        print('whatever')

    def InitUI(self):
        self.text_box = Text(self.parent, wrap='word', height = 11, width=50)
        self.text_box.grid(column=0, row=0, columnspan = 2, sticky='NSWE', padx=5, pady=5)
        sys.stdout = StdoutRedirector(self.text_box)


root = Tk()
gui = CoreGUI(root)
root.mainloop()

创建一个演示您的问题的示例可能会对您有所帮助。SO()上有很多懒惰的用户,因此您越容易调试程序,就会收到越多的答案404@Nicoolasens抱歉,该帐户长期以来一直被自动删除,没有恢复选项。。你可以在github上搜索这个名字,似乎其他人复制了我的部分代码,这样你就可以恢复它。有没有办法重定向stdin?