OiO.lk Community platform!

Oio.lk is an excellent forum for developers, providing a wide range of resources, discussions, and support for those in the developer community. Join oio.lk today to connect with like-minded professionals, share insights, and stay updated on the latest trends and technologies in the development field.
  You need to log in or register to access the solved answers to this problem.
  • You have reached the maximum number of guest views allowed
  • Please register below to remove this limitation

My .py file works perfectly, but when I turn it to .exe it fails

  • Thread starter Thread starter Potato 920
  • Start date Start date
P

Potato 920

Guest
I'm trying to code an app that lets you download many videos (or audios) from Youtube at the same time using Python, specifically the libraries tkinter and pytube. When I run it as a .py file, everything goes perfect. However, when I turn it into a .exe (using auto-py-to-exe), there's a problem, although everything else works, the "Download" Button does absolutely nothing.

I want to clarify, when I press the "Downlaod" button no error pops up, it just doesn't work.

Here's the whole code.

Code:
# importing packages 
from pytube import YouTube 
import tkinter as tk
from tkinter import filedialog, messagebox

WIDTH = "500"
HEIGHT = "300"

dir = ""
url_list = []

root = tk.Tk()
root.geometry(WIDTH + "x" + HEIGHT)
root.resizable(False, True)
root.title("Youtube Downloader")

audio = tk.BooleanVar()
single_song = tk.BooleanVar()

def download(url, dir, audio):
    yt = YouTube(url=url)
    if audio.get(): 
        video = yt.streams.filter(only_audio=True).first()
    else:
        video = yt.streams.get_highest_resolution()
    video.download(output_path=dir) 

    if single_song.get():
        messagebox.showinfo("Done", yt.title + " has been successfully downloaded.")

def change_value(var):
    if var:
        var = False
    else:
        var = True

def get_dir():
    global dir  
    dir = filedialog.askdirectory()

def add(url):
    global url_list
    url_list.append(url)

def display():    
    global url_list
    for child in frm_disp.winfo_children():
        child.destroy()
    for url in url_list:
        label = tk.Label(frm_disp, text=url)
        label.pack()

def clear():
    global url_list
    url_list = []
    for child in frm_disp.winfo_children():
        child.destroy()

def download_all(dir, audio):
    global url_list 
    if len(url_list) == 0:
        messagebox.showwarning("URL","Please write a URL")
        return
    if dir == "":
        messagebox.showwarning("Directory", "Please select a directory")
        return
    
    for url in url_list:
        download(url, dir, audio)

    messagebox.showinfo("Done", "All songs downloaded correctly")

frm = tk.Frame(root, width=480, height=480)
frm.pack()

lbl = tk.Label(root, text="List of songs to be donwloaded (Press \"Display\" to refresh):", pady=10)
lbl.pack()

frm_disp = tk.Frame(root, width=480, height=100, highlightthickness=2,highlightbackground="black")
frm_disp.pack()

btsingle_song = tk.Checkbutton(root, variable=single_song, text="Warn when each song has been downloaded")
btsingle_song.pack()

guide = tk.Label(frm, text="Write the URL of the Youtube video:")
guide.grid(row=0, column=0, columnspan=3,pady=10)

bturl = tk.Entry(frm, width=75)
bturl.grid(row=1, column=0, columnspan=3)

dwn = tk.Button(frm, command= lambda: download_all(dir, audio), width=15, text="Download")
dwn.grid(row=2, column=1)

btdir = tk.Button(frm, command=get_dir, width=15, text="Directory")
btdir.grid(row=2, column=0)

btadd = tk.Button(frm, command= lambda: add(bturl.get()), width=15, text="Add")
btadd.grid(row=3, column=0)

disp = tk.Button(frm, command=display, width=15, text="Display")
disp.grid(row=3, column=1)

clr = tk.Button(frm, command=clear, width=15, text="Clear")
clr.grid(row=3, column=2)

only_audio = tk.Checkbutton(frm, text="Only audio (as mp3)", variable=audio)
only_audio.grid(row=2, column=2)

root.update()
root.mainloop()

I have tried to attach the folders in auto-py-to-exe to see if the modules were the problem, but It didn't work. I've also tried running it in a virtual environment that has pytube installed (as it is not installed on my machine, it is installed on an env), but it didn't work either.

As the only problem is the "Download" button I've thought that maybe pytube is the problem, but I've got no idea.

Update: I kept testing the code and whenever I try to download a video or audio, it throws the following error:

Code:
Traceback (most recent call last):
  File "tkinter\__init__.py", line 1892, in __call__
  File "DonwloadYoutube.py", line 93, in <lambda>
  File "DonwloadYoutube.py", line 71, in download_all
  File "DonwloadYoutube.py", line 27, in download
  File "pytube\__main__.py", line 296, in streams
  File "pytube\__main__.py", line 181, in fmt_streams
  File "pytube\extract.py", line 409, in apply_signature
  File "pytube\cipher.py", line 30, in __init__
  File "re.py", line 252, in compile
  File "re.py", line 304, in _compile
  File "sre_compile.py", line 764, in compile
  File "sre_parse.py", line 950, in parse
  File "sre_parse.py", line 443, in _parse_sub
  File "sre_parse.py", line 668, in _parse
re.error: nothing to repeat at position 2

I've also tested the executable in other machines and it throws this error too, although when I run the code it always works.
<p>I'm trying to code an app that lets you download many videos (or audios) from Youtube at the same time using Python, specifically the libraries tkinter and pytube. When I run it as a .py file, everything goes perfect. However, when I turn it into a .exe (using auto-py-to-exe), there's a problem, although everything else works, the "Download" Button does absolutely nothing.</p>
<p><s>I want to clarify, when I press the "Downlaod" button no error pops up, it just doesn't work.</s></p>
<p>Here's the whole code.</p>
<pre><code># importing packages
from pytube import YouTube
import tkinter as tk
from tkinter import filedialog, messagebox

WIDTH = "500"
HEIGHT = "300"

dir = ""
url_list = []

root = tk.Tk()
root.geometry(WIDTH + "x" + HEIGHT)
root.resizable(False, True)
root.title("Youtube Downloader")

audio = tk.BooleanVar()
single_song = tk.BooleanVar()

def download(url, dir, audio):
yt = YouTube(url=url)
if audio.get():
video = yt.streams.filter(only_audio=True).first()
else:
video = yt.streams.get_highest_resolution()
video.download(output_path=dir)

if single_song.get():
messagebox.showinfo("Done", yt.title + " has been successfully downloaded.")

def change_value(var):
if var:
var = False
else:
var = True

def get_dir():
global dir
dir = filedialog.askdirectory()

def add(url):
global url_list
url_list.append(url)

def display():
global url_list
for child in frm_disp.winfo_children():
child.destroy()
for url in url_list:
label = tk.Label(frm_disp, text=url)
label.pack()

def clear():
global url_list
url_list = []
for child in frm_disp.winfo_children():
child.destroy()

def download_all(dir, audio):
global url_list
if len(url_list) == 0:
messagebox.showwarning("URL","Please write a URL")
return
if dir == "":
messagebox.showwarning("Directory", "Please select a directory")
return

for url in url_list:
download(url, dir, audio)

messagebox.showinfo("Done", "All songs downloaded correctly")

frm = tk.Frame(root, width=480, height=480)
frm.pack()

lbl = tk.Label(root, text="List of songs to be donwloaded (Press \"Display\" to refresh):", pady=10)
lbl.pack()

frm_disp = tk.Frame(root, width=480, height=100, highlightthickness=2,highlightbackground="black")
frm_disp.pack()

btsingle_song = tk.Checkbutton(root, variable=single_song, text="Warn when each song has been downloaded")
btsingle_song.pack()

guide = tk.Label(frm, text="Write the URL of the Youtube video:")
guide.grid(row=0, column=0, columnspan=3,pady=10)

bturl = tk.Entry(frm, width=75)
bturl.grid(row=1, column=0, columnspan=3)

dwn = tk.Button(frm, command= lambda: download_all(dir, audio), width=15, text="Download")
dwn.grid(row=2, column=1)

btdir = tk.Button(frm, command=get_dir, width=15, text="Directory")
btdir.grid(row=2, column=0)

btadd = tk.Button(frm, command= lambda: add(bturl.get()), width=15, text="Add")
btadd.grid(row=3, column=0)

disp = tk.Button(frm, command=display, width=15, text="Display")
disp.grid(row=3, column=1)

clr = tk.Button(frm, command=clear, width=15, text="Clear")
clr.grid(row=3, column=2)

only_audio = tk.Checkbutton(frm, text="Only audio (as mp3)", variable=audio)
only_audio.grid(row=2, column=2)

root.update()
root.mainloop()


</code></pre>
<p>I have tried to attach the folders in auto-py-to-exe to see if the modules were the problem, but It didn't work. I've also tried running it in a virtual environment that has pytube installed (as it is not installed on my machine, it is installed on an env), but it didn't work either.</p>
<p>As the only problem is the "Download" button I've thought that maybe pytube is the problem, but I've got no idea.</p>
<p>Update:
I kept testing the code and whenever I try to download a video or audio, it throws the following error:</p>
<pre><code>Traceback (most recent call last):
File "tkinter\__init__.py", line 1892, in __call__
File "DonwloadYoutube.py", line 93, in <lambda>
File "DonwloadYoutube.py", line 71, in download_all
File "DonwloadYoutube.py", line 27, in download
File "pytube\__main__.py", line 296, in streams
File "pytube\__main__.py", line 181, in fmt_streams
File "pytube\extract.py", line 409, in apply_signature
File "pytube\cipher.py", line 30, in __init__
File "re.py", line 252, in compile
File "re.py", line 304, in _compile
File "sre_compile.py", line 764, in compile
File "sre_parse.py", line 950, in parse
File "sre_parse.py", line 443, in _parse_sub
File "sre_parse.py", line 668, in _parse
re.error: nothing to repeat at position 2
</code></pre>
<p>I've also tested the executable in other machines and it throws this error too, although when I run the code it always works.</p>
 
Top