2017-06-17 12 views
0
class Video: 
    def __init__(self): 
     self.v1 = StringVar()  
     self.entry1 = Entry(root, textvariable=v1) 
     self.entry1.pack() 
     self.downloadUrl = v1.get() 
    def downloadVideo(self): 

     ydl_opts = {} 
     with youtube_dl.YoutubeDL(ydl_opts) as ydl: 
       self.ydl.download([self.downloadUrl]) 
menu = Menu(root) 
root.config(menu=menu)  
menuOne = Menu(menu, tearoff=0) 
menu.add_cascade(label='Magrobebi', menu=menuOne) 
menuOne.add_command(label='Download Video', command=Video.downloadVideo) 

ビデオをダウンロードするメニューを作成しようとしています。私はグローバル変数ではないので、そのdownloadUrlの周りを動かすのに問題がありました。 コマンド自体をクラスに入れることはできません。そのような方法でも作成されないからです。現在、 "TypeError:downloadVideo()missing 1必要な位置引数: 'self'"は私が抱えていたエラーです。このクラス内の別のクラスから関数を呼び出すことはできません。どうすればこの問題を回避できますか?私はちょうどユーザーがリンクを入力してそれをダウンロードできるエントリを作成するボタンを持っています。クラスtkinterから関数を呼び出せません

+1

:代わりに、あなたが実際にdownloadVideoの内側にある値を、必要な時にv1.get()を呼び出す必要があります。静的にする(メソッドの上に@staticmethod)か、そのクラスのインスタンスをインスタンス化する必要があります。 –

答えて

0

selfに参照することは問題がある場合は、例えば、クラスの外にコードを追加することができます。

from tkinter import * 
import youtube_dl 

root = Tk() 

v1 = StringVar()  
entry1 = Entry(root, textvariable=v1) 
entry1.pack() 

def downloadVideo(): 
    downloadUrl = v1.get() 
    ydl_opts = {} 
    with youtube_dl.YoutubeDL(ydl_opts) as ydl: 
      ydl.download(downloadUrl) 

menu = Menu(root) 
root.config(menu=menu)  
menuOne = Menu(menu, tearoff=0) 
menu.add_cascade(label='Magrobebi', menu=menuOne) 
menuOne.add_command(label='Download Video', command=downloadVideo) 

root.mainloop() 

これは、ボタンを押しながらウィンドウを生成しますが、ビデオをダウンロードするオプションを提供します、その下に入力ボックスがあります。

編集:downloadVideo()を呼び出す必要があるdownloadUrl = v1.get()は、.get()としてStringVar()の文字列をすぐに取得します。

+0

さて、私はそれを好きでしたが、今問題は正しくエントリの内容を読み取ることができないと思われますが、エラー "エラー: ''は有効なURLではありません。この周り? – Niko

+0

@ニコ私は答えを編集し、 'get()'メソッドはビデオのリクエストの直前に呼び出す必要がありました。 –

+0

まあ、ありがとう、ああ、神は祝福を祝福しました!:D – Niko

0

downloadVideoVideoのメソッドなので、Videoのインスタンスを作成してから関数を呼び出すだけで済みます。これはtkinterとは関係ありません。これは単にPythonクラスの仕組みです。例えば

video = Video() 
menuOne.add_command(..., command=video.downloadVideo) 

は、しかし、あなたはこれを行うVideo内の別のバグがあります。

def __init__(self): 
    self.v1 = StringVar()  
    self.entry1 = Entry(root, textvariable=v1) 
    self.entry1.pack() 
    self.downloadUrl = v1.get() 

をあなたはそれが常になりますself.v1を作成した後にself.downloadUrl、約1ミリ秒に設定されています空の文字列。あなたのdownloadVideoメソッドが静的ではありません

def downloadVideo(self): 
    ydl_opts = {} 
    url = self.v1.get() 
    with youtube_dl.YoutubeDL(ydl_opts) as ydl: 
      self.ydl.download([url]) 
+0

あまりにも、ありがとう! :D – Niko

関連する問題