Как превратить этот скрипт Python, основанный на pyautogui, в исполняемый файл в python3.9?

Я пробовал обычный pyinstaller, cx_Freeze, cx_Freeze с idna, но он все равно не работает. Когда я запускаю exe-файлы, которые я создал до сих пор, это всегда заканчивается открытием и закрытием командной строки/терминала. Он прекрасно работает в python IDLE, но я не понимаю, почему он не работает как exe-файл. Это код:

import pyautogui
import subprocess
from tkinter import *
import tkinter.messagebox as msgbox  
import time
from pynput.keyboard import Key, Controller
from PIL import ImageTk, Image

keyboard = Controller()

root = Tk()
root.geometry("550x500")
root.title("Youtube-dl")

global button_on
button_on = False

global button2_on
button2_on = False

global button3_on
button3_on = False

global link
link = StringVar()

def download():
    global link
    global button_on
    global button2_on
    global button3_on
    
    pyautogui.hotkey('winleft', 'd')
    time.sleep(0.3)
    command = "cmd"
    subprocess.Popen(command)
    time.sleep(1)
    for char in "cd /":
                keyboard.press(char)
                keyboard.release(char)
                time.sleep(0.05)
                
    pyautogui.press('enter')
    for char in "cd users":
                keyboard.press(char)
                keyboard.release(char)
                time.sleep(0.05)
                
    pyautogui.press('enter')
    for char in "cd admin":
                keyboard.press(char)
                keyboard.release(char)
                time.sleep(0.05)
                
    pyautogui.press('enter')
    for char in "cd desktop":
                keyboard.press(char)
                keyboard.release(char)
                time.sleep(0.05)
                
    pyautogui.press('enter')
    for char in "cd youtube-dl":
                keyboard.press(char)
                keyboard.release(char)
                time.sleep(0.05)
                
    pyautogui.press('enter')
    if (button_on==True) and (button3_on==False):
        for char in 'youtube-dl '+str(link.get()):
                keyboard.press(char)
                keyboard.release(char)
                time.sleep(0.05)
    elif (button_on==True) and (button3_on==True):
        for char in 'youtube-dl -cit '+str(link.get()):
                keyboard.press(char)
                keyboard.release(char)
                time.sleep(0.05)
    elif (button2_on==True) and (button3_on==False):
        for char in 'youtube-dl --extract-audio --audio-format mp3 '+str(link.get()):
                keyboard.press(char)
                keyboard.release(char)
                time.sleep(0.05)
    elif (button2_on==True) and (button3_on==True):
        for char in 'youtube-dl -cit --extract-audio --audio-format mp3 '+str(link.get()):
                keyboard.press(char)
                keyboard.release(char)
                time.sleep(0.05)
                
    pyautogui.press('enter')
    
def switch1():
    global button_on
    global button2_on
    
    if button_on==True:
        button1.config(image=off)
        button_on = False
    else:
        button1.config(image=on)
        button2.config(image=off)
        button_on = True
        button2_on = False
      
def switch2():
    global button_on
    global button2_on
    
    if button2_on==True:
        button2.config(image=off)
        button2_on = False
    else:
        button1.config(image=off)
        button2.config(image=on)
        button_on = False
        button2_on = True
        
def switch3():
    global button3_on
    
    if button3_on==True:
        button3.config(image=off)
        button3_on = False
    else:
        button3.config(image=on)
        button3_on = True
        
onpic = Image.open("images/onbutton.png")
offpic = Image.open("images/offbutton.png")
onresized = onpic.resize((85, 45), Image.ANTIALIAS)
offresized = offpic.resize((85, 45), Image.ANTIALIAS)
on = ImageTk.PhotoImage(onresized)
off = ImageTk.PhotoImage(offresized)

f1 = Frame(root,pady=6)
Label(f1,text="Link",font="comicsans 10").pack()
linkentry = Entry(f1,textvariable=link,width=48,font="comicsans 9",relief=SUNKEN)
linkentry.pack()
f1.pack()

button1 = Button(root, image=off, bd=0, command=switch1)
button1.pack(pady=5)
f2 = Frame(root)
Label(f2,text="Video",font="comicsans 10").pack()
f2.pack()

space = Frame(root,pady=1)
Label(space,text="                      ",font="comicsans 10").pack()
space.pack()

button2 = Button(root, image=off, bd=0, command=switch2)
button2.pack(pady=5)
f3 = Frame(root)
Label(f3,text="Audio",font="comicsans 10").pack()
f3.pack()

space = Frame(root,pady=1)
Label(space,text="                      ",font="comicsans 10").pack()
space.pack()

button3 = Button(root, image=off, bd=0, command=switch3)
button3.pack(pady=5)
f4 = Frame(root)
Label(f4,text="Playlist",font="comicsans 10").pack()
f4.pack()

space = Frame(root,pady=1.5)
Label(space,text="                      ",font="comicsans 10").pack()
space.pack()

f5 = Frame(root)
Button(f5,text="Download",command=download).pack()
f5.pack()

person Jeff Maco    schedule 25.04.2021    source источник
comment
Вам не хватает root.mainloop()?   -  person TheLizzard    schedule 25.04.2021


Ответы (1)


При использовании pyinstaller попробуйте команду pyinstaller --onefile -w nameofyourfile.py в cmd (w означает оконные приложения, я думаю, но дело в том, что консоль не открывается)

person SimonTheAnt    schedule 25.04.2021
comment
Пожалуйста, отформатируйте части сообщения, связанные с кодом, чтобы оно выглядело более читабельным. - person GooDeeJAY; 26.04.2021