Как получить журналы консоли Python в моем окне tkinter вместо окна CMD при выполнении исполняемого файла, созданного с помощью pyinstaller - PullRequest
0 голосов
/ 11 декабря 2018

Постановка проблемы

Я создал сценарий python 3.6, который выполняет некоторое преобразование данных и использует tkinter для графического интерфейса пользователя (выбор папки и другие параметры).

Я преобразовал это вфайл exe, использующий pyinstaller и хотел бы, чтобы другие пользователи (у которых не установлен python) могли использовать этот инструмент.

Однако, когда я открываю exe, он открываетCMD window, который показывает журналы, обычно показанные на python console.

Я бы хотел перенаправить это в text box или frame в самом моем окне tkinter - вместо открытия нового окна CMD при нажатии.

Пример кода

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()

Затем я конвертирую файл в exe, используя pyinstaller

> pyinstaller --onefile TkinterGUI_test.py

Ожидаемый результат

enter image description here

Я видел множество сообщений о stackoverflow, которые связаны, но не соответствуют моим требованиям.Любая помощь будет высоко оценен.Спасибо!:)

1 Ответ

0 голосов
/ 11 декабря 2018

, чтобы скрыть консоль, вам нужно добавить --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 вставляет символы новой строки и все остальное, что обычно делается в терминале.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...