将 stdout(打印)命令打印到扩展名为 .pyw 的 tkinter window
Printing stdout (print) commands to tkinter window with .pyw extension
我正在使用 tkinter 制作一个 Python (3) GUI 程序,我正在使用重定向功能将我所有的打印语句定向到 GUI 滚动文本框。
这是重定向功能(与 tkinter window 相同 class):
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 的方法 Window。
您的打印调用无法正常工作的原因是,当您 运行 在 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()
我正在使用 tkinter 制作一个 Python (3) GUI 程序,我正在使用重定向功能将我所有的打印语句定向到 GUI 滚动文本框。
这是重定向功能(与 tkinter window 相同 class):
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 的方法 Window。
您的打印调用无法正常工作的原因是,当您 运行 在 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()