#python #python-3.x #kivy #kivymd
#python #python-3.x #kivy #kivymd
Вопрос:
Я пытаюсь создать загрузчик видео с YouTube, но я застрял и получаю странную ошибку, я не знаю, как? Я думаю, что мой код выглядит нормально, но что-то не так, я бы попробовал, но я не мог понять это!
Пожалуйста, помогите мне —
ошибка
Traceback (most recent call last):
File "/home/rohit/Desktop/Youtube_downloader/main.py", line 84, in <module>
Itube().run()
File "/home/rohit/Desktop/Youtube_downloader/main.py", line 38, in __init__
self.file_manager = MDFileManager(
File "/home/rohit/Desktop/Youtube_downloader/env/lib/python3.8/site-packages/kivymd/uix/filemanager.py", line 403, in __init__
super().__init__(**kwargs)
File "/home/rohit/Desktop/Youtube_downloader/env/lib/python3.8/site-packages/kivymd/theming.py", line 907, in __init__
super().__init__(**kwargs)
File "/home/rohit/Desktop/Youtube_downloader/env/lib/python3.8/site-packages/kivy/uix/floatlayout.py", line 65, in __init__
super(FloatLayout, self).__init__(**kwargs)
File "/home/rohit/Desktop/Youtube_downloader/env/lib/python3.8/site-packages/kivy/uix/layout.py", line 76, in __init__
super(Layout, self).__init__(**kwargs)
File "/home/rohit/Desktop/Youtube_downloader/env/lib/python3.8/site-packages/kivymd/uix/behaviors/backgroundcolorbehavior.py", line 150, in __init__
super().__init__(**kwargs)
File "/home/rohit/Desktop/Youtube_downloader/env/lib/python3.8/site-packages/kivy/uix/widget.py", line 350, in __init__
super(Widget, self).__init__(**kwargs)
File "kivy/_event.pyx", line 245, in kivy._event.EventDispatcher.__init__
TypeError: object.__init__() takes exactly one argument (the instance to initialize)
main.py
from kivymd.app import MDApp
from kivy.lang import Builder
from kivy.uix.screenmanager import Screen, ScreenManager
from kivy.core.window import Window
from kivymd.uix.filemanager import MDFileManager
from kivymd.toast import toast
from youtube_dl import kv
Window.size = (450, 740)
class HomeScreen(Screen):
pass
class SigninScreen(Screen):
pass
sm = ScreenManager()
sm.add_widget(HomeScreen(name='homescreen'))
sm.add_widget(SigninScreen(name='signinscreen'))
class Itube(MDApp):
def __init__(self, **kwargs):
super().__init__(**kwargs)
Window.bind(on_keyboard=self.events)
self.manager_open = False
self.file_manager = MDFileManager(
exit_manager = self.exit_manager,
self_path = self.select_path,
preview = True,
)
def build(self):
return Builder.load_string(kv)
def file_manager_open(self):
self.file_manager.show('/') # output manager to the screen
self.manager_open = True
def select_path(self, path):
'''It will be called when you click on the file name
or the catalog selection button.
:type path: str;
:param path: path to the selected directory or file;
'''
self.exit_manager()
toast(path)
def exit_manager(self, *args):
'''Called when the user reaches the root of the directory tree.'''
self.manager_open = False
self.file_manager.close()
def events(self, instance, keyboard, keycode, text, modifiers):
'''Called when buttons are pressed on the mobile device.'''
if keyboard in (1001, 27):
if self.manager_open:
self.file_manager.back()
return True
if __name__ == "__main__":
Itube().run()
youtube_dl.py
kv = """
ScreenManager:
HomeScreen:
SigninScreen:
<HomeScreen>:
name: 'homescreen'
MDBoxLayout:
orientation: 'vertical'
spacing: 20
padding: 40
MDTextFieldRound:
hint_text: 'Url'
multline: False
normal_color: (1, 1, 1, 100)
color_active: (232/255, 232/255, 232/255, 600)
MDBoxLayout:
orientation: 'horizontal'
adaptive_size: True
spacing: 22
pos_hint: {'center_x': 0.5, 'center_y': .99}
MDToolbar:
title: 'FileManager'
left_action_items: [['menu', lambda x: None]]
elevation: 10
MDRaisedButton:
text: 'Import from computer'
icon: "folder"
on_release: app.file_manager_open()
MDRaisedButton:
text: 'Import from itube cloud'
<SigninScreen>:
name: 'signinscreen'
"""
Или не могли бы вы объяснить мне, как лучше всего структурировать большое приложение kivymd.
Комментарии:
1. Постарайтесь сузить свой вопрос до одного вопроса сразу, а не до трех несвязанных вопросов плюс очень широкий запрос. Кроме того, если у вас возникла ошибка, опубликуйте ее полностью — вы опубликовали только небольшой объем текста, который не содержит никакой контекстной информации, предназначенной для выявления проблемы. И, наконец, попробуйте привести более минимальный пример, маловероятно, что большая часть кода здесь необходима для возникновения ошибки, поэтому читателям будет только сложнее определить вашу проблему.
2. Что касается ошибки, это означает, что вы передали неожиданный аргумент классу, и этот аргумент в конечном итоге был передан по цепочке суперклассов, пока он не достигнет
object.__init__
. Поэтому вам следует искать места, где вы передаете аргументы, которые не существуют, например, для строкиexit_manager = self.exit_manager,
exit_manager
, которая на самом деле является допустимым аргументом здесь?3. Если я удалю
self.exit_manager
, я получуexit_manager = exit_manager, NameError: name 'exit_manager' is not defined
ошибку.4.
exit_manager
это был просто пример, вам нужно искать тип ошибки, который я описал.5. Кроме того, дополнительное содержимое ошибки, которое вы не вставили сюда, вероятно, содержит некоторые подсказки о том, какой экземпляр объекта является проблемой.
Ответ №1:
В self.file_manager вы написали self_path = self.select_path
. Это будет select_path = self.select_path
. Кроме того, я не знаю, что не так с preview=True
, может быть, ошибка. Таким образом, ваша функция будет:
def __init__(self, **kwargs):
super().__init__(**kwargs)
Window.bind(on_keyboard=self.events)
self.manager_open = False
self.file_manager = MDFileManager(
exit_manager = self.exit_manager,
select_path = self.select_path,
)
self.file_manager.preview = True #Can try if it works