如何在执行使用 pyinstaller 创建的 exe 文件时在我的 tkinter 窗口而不是 CMD 窗口上获取 python 控制台日志

Par*_*nks 2 tkinter pyinstaller python-3.x

问题陈述

我创建了一个python 3.6脚本来执行一些数据转换并tkinter用于 GUI(文件夹选择和其他选项)。

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

然而,当我打开exe,它会打开一个CMD window足见日志通常的显示python console

我想将其重定向到我的窗口本身中的text box或- 而不是在单击时打开一个新的 CMD 窗口。frametkinter

示例代码

import tkinter as tk
from tkinter import filedialog as fd

def browse():
    directory=fd.askdirectory()
    print ('The selected  directory is: ', directory)

def convert():
    # perform file manipulation
    print ("Files converted")

window = tk.Tk()
window.title("Title")
label=tk.Label(window,text="Instructions")
label.pack()
browseButton=tk.Button(window,text="Browse Folder", command=browse)
browseButton.pack(pady=10)
runButton=tk.Button(window,text="Convert files", command=convert)
runButton.pack(pady=10)
window.mainloop()
Run Code Online (Sandbox Code Playgroud)

然后我将文件转换为exe使用pyinstaller

> pyinstaller --onefile TkinterGUI_test.py
Run Code Online (Sandbox Code Playgroud)

预期结果

在此处输入图片说明

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

Jam*_*ent 5

要隐藏控制台,您需要将其添加--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()
Run Code Online (Sandbox Code Playgroud)

因为打印语句通过替换我们在文本框中得到的输出来将其输出定向到 sys.stdout,这意味着print插入换行符以及它通常在终端中执行的任何其他操作。