将stdout(print)命令打印到扩展名为.pyw的tkinter窗口

时间:2016-11-24 21:32:22

标签: python python-3.x user-interface tkinter stdout

我正在使用tkinter制作Python(3)GUI程序,我使用重定向功能将所有打印语句定向到GUI滚动文本框。

这是重定向功能(与tkinter窗口在同一类中):

def redirector(self,inputStr):
    self.txt.insert(tk.INSERT, inputStr)
    self.txt.update()
    self.txt.see(tk.END)

然后,当我想开始重定向输出时,我添加了这一行:

sys.stdout.write = self.redirector

但是当我将文件重命名为.pyw时,文本框中没有任何内容。请建议一种方法,将文本正确地指向GUI窗口。

1 个答案:

答案 0 :(得分:1)

您的打印调用无法正常工作的原因是,当您在Windows上运行.pyw文件时,运行您的程序的可执行文件实际上是pythonw.exe,它在内部初始化您的应用程序调用WinMain(),因此不会创建控制台。没有控制台意味着没有标准IO流,因此sys.stdout未定义。

相反,我建议您继承tk.Text并将write()flush()函数定义为实例方法。然后你所要做的就是将sys.stdout设置为子类实例,一切都应该有效。

import sys
import tkinter as tk


class TextOut(tk.Text):

    def write(self, s):
        self.insert(tk.CURRENT, s)

    def flush(self):
        pass


if __name__ == '__main__':
    root = tk.Tk()
    text = TextOut(root)
    sys.stdout = text
    text.pack(expand=True, fill=tk.BOTH)
    root.mainloop()