Можно ли активировать консоль только в определенные моменты времени после компиляции py в exe с использованием pyinstaller или чего-либо еще? - PullRequest
0 голосов
/ 20 апреля 2019

Я создаю программу на python, которая будет копировать большие файлы, используя robocopy. Поскольку графический интерфейс зависает во время копирования, у меня есть только два варианта: 1. Узнайте, как выполнять многопоточность и разрабатывать графический интерфейс, чтобы показать прогресс и не зависать. 2. Оставьте консоль включенной после компиляции с помощью pyinstaller в качестве альтернативы, чтобы показать процесс выполнения robocopy во время зависания графического интерфейса.

Я открыт для многопоточности, но я новичок, и мне довольно сложно понять, как сделать еще один подпроцесс для робокопии, и оттуда извлечь прогресс в метку из графического интерфейса. Вариант, о котором я подумал, - это активировать консоль cmd, только когда копирование завершено. Является ли это возможным? Сценарий будет таким:

  1. Открыть программу (консоль будет скрыта)
  2. Нажмите кнопку копирования (консоль всплывает и показывает ход копирования, пока графический интерфейс останавливается)
  3. После завершения копирования снова скрыть консоль

Как я сказал выше. Я не исключаю полностью добавления многопоточности, но для этого мне понадобится помощь.

Спасибо!

1 Ответ

0 голосов
/ 20 апреля 2019

Пожалуйста, попробуйте этот код, должен работать, пожалуйста, дайте мне знать, если что-то не так:

import tkinter as tk
import os
import subprocess
import threading


main = tk.Tk()
main.title('Title')
frame_main = tk.Frame(main)
frame_main.grid(columnspan=1)

src = 'D:/path/to/the/folder'
dest = 'D:/path/to/the/folder2'
selection_platf = len(os.name)


def copy_build_button():
    if selection_platf < 11:
        subprocess.call(["robocopy", src, dest, r"/XF", 'BT V_SyncPackage.zip', "/S"])
    else: #for linux
        subprocess.call(["robocopy", src, dest, "/S"])


def copy_thread():
    thread_1 = threading.Thread(target=copy_build_button)
    thread_1.start()


button_main1 = tk.Button(frame_main, text="copy_build_button", width=50, height=5, fg="green", command=copy_thread)
button_main1.grid(column=0, sticky='N'+'S'+'E'+'W')

main.mainloop()
...