Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 无法使用asksaveas函数_Python_Tkinter_Youtube - Fatal编程技术网

Python 无法使用asksaveas函数

Python 无法使用asksaveas函数,python,tkinter,youtube,Python,Tkinter,Youtube,我正在制作一个GUI应用程序,用户可以从youtube下载任何视频,下面是我正在使用的代码: from pytube import YouTube from tkinter import * from tkinter import messagebox from tkinter.filedialog import * from threading import * root=Tk() root.iconbitmap('yticon.ico') root.title('Youtube Vide

我正在制作一个GUI应用程序,用户可以从youtube下载任何视频,下面是我正在使用的代码:

from pytube import YouTube
from tkinter import *
from tkinter import messagebox
from tkinter.filedialog import *
from threading import *

root=Tk()

root.iconbitmap('yticon.ico')
root.title('Youtube Video Downloader')
root.resizable(0,0)

file_size=0
url=''

def downThread():
    p1=Thread(target=downloader)
    p1.start()
def progress(chunk,file_handle,remaining):
    global download_status
    file_download=file_size-remaining
    per=(file_download/file_size)*100
    download_status.config(text='{:00.0f}% downloaded'.format(per))

def downloader():
    global file_size, download_status, url
    download_btn.config(state=DISABLED)
    download_status.place(x=200, y=250)
    #try:
    link=url.get()
    path=asksaveasfilename(title='Save File', defaultextension='.mp4', filetype=(('*.mp4', 'MP4 Files')))
    yt=YouTube(link, on_progress_callback=progress)
    video=yt.streams.filter(progressive=True, file_extension='mp4').first()
    file_size=video.filesize
    #assert isinstance(video, bytes)
    video.download(path)
    download_status.config(text='Download Finished...')
    res=messagebox.askyesno('Youtube Downloader','Do You want to download another video?')
    if res==1:
        url.delete(0,END)
        download_btn.config(state=NORMAL)
        download_status.config(text=' ')
    else:
        root.destroy()
    #except Exception as e:
     #   download_status.config(text='Failed!!There was an error')

imgfile=PhotoImage(file='yticon1.png')
back_img=Label(root, image=imgfile)
back_img.place(x=0,y=0,relwidth=1,relheight=1)
entr_url=Label(root, text='Enter Url', font='Algerian 15 bold')
entr_url.place(x=20,y=40)
url=Entry(root, width=30, bd=2, relief=SUNKEN, font=('Calibiri(Body)', 12))
url.place(x=140, y=40)
btnimg=PhotoImage(file='yt.png')
download_btn=Button(root, width=99, height=50, relief=RIDGE, activebackground='red', image=btnimg, command=downThread, bd=7)
download_btn.place(x=220, y=170)
download_status=Label(root, text='Please Wait...', font=('Arial',15))
root.geometry('700x400+150+150')
root.mainloop()
但是当我运行这段代码时,它会给出这个错误,我该如何解决它呢

_tkinter.TclError: bad file type ".mp4", should be "typeName {extension ?extensions ...?} ?{macType ?macTypes ...?}?"
link=url.get()

path=asksaveasfilename(title='Save File',defaultextension='.mp4',filetype=('*.mp4','mp4 Files'))

yt=YouTube(链接,on\u progress\u callback=progress) [('*.mp4','mp4文件')]`
您必须这样做,因为文件类型将是列表形式。

path=asksaveasfilename(title='Save File',defaultextension='.mp4',filetype=[('*.mp4','mp4 File'))
您必须这样做
filetype=('*.mp4','mp4 Files'))
应该是
filetype=(('mp4 Files','*.mp4'),
filetype=[('mp4 Files',''.*.mp4')
@acw1668谢谢,它可以工作,但是当我用asksaveasfilename对话框中指定的名称下载视频时,它会用该名称创建一个目录,并且视频文件的名称保持不变。
download()
函数的第一个参数是输出文件夹,第二个参数是文件名。所以你应该这样称呼它:
folder,filename=os.path.split(path)
,然后是
video.download(output\u path=folder,filename=filename)
('*.mp4','mp4 File')应该是
('mp4 File','*.mp4')
。这在我这边可能不起作用,我总是这样做的。根据,文件类型-一系列(标签,模式)元组。但是我的代码是如何工作的呢?我用(模式,标签)来做这件事,它也能工作。对话框会出现,但模式的文件不会显示。