Python 3.x 如何在执行使用pyinstaller创建的exe文件时,在tkinter窗口而不是CMD窗口上获取python控制台日志 问题陈述

Python 3.x 如何在执行使用pyinstaller创建的exe文件时,在tkinter窗口而不是CMD窗口上获取python控制台日志 问题陈述,python-3.x,tkinter,pyinstaller,Python 3.x,Tkinter,Pyinstaller,我已经创建了一个python3.6脚本,它执行一些数据转换,并使用tkinter作为GUI(文件夹选择和其他选项) 我已使用pyinstaller将其转换为exe文件,希望其他用户(未安装python的用户)能够使用该工具 但是,当我打开exe时,它会打开一个CMD窗口,其中显示通常在python控制台上显示的日志 我希望将其重定向到我的tkinter窗口本身的文本框或框架——而不是单击时打开新的CMD窗口 示例代码 然后我使用pyinstaller将文件转换为exe > pyinstal

我已经创建了一个
python3.6
脚本,它执行一些数据转换,并使用
tkinter
作为GUI(文件夹选择和其他选项)

我已使用
pyinstaller
将其转换为
exe
文件,希望其他用户(未安装python的用户)能够使用该工具

但是,当我打开
exe
时,它会打开一个
CMD窗口
,其中显示通常在
python控制台上显示的日志

我希望将其重定向到我的
tkinter
窗口本身的
文本框
框架
——而不是单击时打开新的CMD窗口

示例代码 然后我使用
pyinstaller
将文件转换为
exe

> pyinstaller --onefile TkinterGUI_test.py
预期结果


我在stackoverflow上看到过很多相关的帖子,但都不符合我的要求。任何帮助都将不胜感激。谢谢!:)

要隐藏控制台,需要将
--noconsole
添加到pyinstaller命令中

为了重定向打印输出,您可以使用如下内容:

import tkinter as tk
import sys

class PrintLogger(): # create file like object
    def __init__(self, textbox): # pass reference to text widget
        self.textbox = textbox # keep ref

    def write(self, text):
        self.textbox.insert(tk.END, text) # write text to textbox
            # could also scroll to end of textbox here to make sure always visible

    def flush(self): # needed for file like object
        pass

if __name__ == '__main__':
    def do_something():
        print('i did something')
        root.after(1000, do_something)

    root = tk.Tk()
    t = tk.Text()
    t.pack()
    # create instance of file like object
    pl = PrintLogger(t)

    # replace sys.stdout with our object
    sys.stdout = pl

    root.after(1000, do_something)
    root.mainloop()

因为print语句通过替换文本框中完全相同的输出,将其输出定向到sys.stdout,这意味着
print
插入换行符和它通常在终端中执行的任何其他操作。

那么,在打印语句时,您必须创建
tk.labels
something@Max,谢谢你的回复。如果我必须把我所有的照片都转换成tk标签,那听起来有点太乱了。我会试试的。其他对象(如matplotlib绘图)如何?matplotlib绘图将更加混乱,这是一个完整的其他模块!标签只会在tkinter窗口中添加文本;不是Messytanks@James,“--noconsole”很好用!我将尝试使用您的重定向脚本,并让您知道它是否也起作用。:)所以我需要做的就是将我的打印语句重定向到Printlogger?它还会以某种方式支持.format选项吗?如果print语句支持它,那么它将支持它,因为它捕获的是打印输出,而不是内部加工。这不是问题。注意:如果需要显示异常文本,您可以用相同的方式重定向stderr,但是您仍然必须捕获异常,以阻止python在异常发生时退出。@ParvBanks我已更正,您可以通过使用tk后端将图像保存到matplotlib来完成此操作,获取tk画布的句柄并使用
test.window\u create
嵌入它。但这是另一个问题。尝试一下,如果你在发布另一个问题时遇到困难,你会得到帮助
import tkinter as tk
import sys

class PrintLogger(): # create file like object
    def __init__(self, textbox): # pass reference to text widget
        self.textbox = textbox # keep ref

    def write(self, text):
        self.textbox.insert(tk.END, text) # write text to textbox
            # could also scroll to end of textbox here to make sure always visible

    def flush(self): # needed for file like object
        pass

if __name__ == '__main__':
    def do_something():
        print('i did something')
        root.after(1000, do_something)

    root = tk.Tk()
    t = tk.Text()
    t.pack()
    # create instance of file like object
    pl = PrintLogger(t)

    # replace sys.stdout with our object
    sys.stdout = pl

    root.after(1000, do_something)
    root.mainloop()