TypeError: method () принимает 1 позиционный аргумент, но были заданы 2 (Python и Kivy) - PullRequest
0 голосов
/ 24 апреля 2019

Я пытаюсь использовать функцию внутри моего py-файла для изменения экранов через определенное количество секунд, это 2 экрана и ScreenManager (хотя и не весь код, сокращенный до важных битов):

class StartScreen(Screen):
    pass

class Buttons(Screen):

    def change_screen(self):
        WindowManager.current = "start_screen"


class WindowManager(ScreenManager):
    pass

kv = Builder.load_file("my.kv")

class MyApp(App):

    def build(self):
        return kv


if __name__ == '__main__':
    Window.fullscreen = "auto"
    MyApp().run()

и это весь файл kv:

#:import NoTransition kivy.uix.screenmanager.NoTransition
#:import Clock kivy.clock.Clock

WindowManager:
    transition: NoTransition()

    StartScreen:
    Buttons:


<StartScreen>:
    name: "start_screen"

    Button:
        background_normal: "maxresdefault.jpg"
        background_down: "maxresdefault.jpg"
        size_hint: 0.3, 0.3
        pos_hint: {"x": .35, "y": .35}
        text: "Play"
        font_size: 250
        on_release:
            app.root.current = "btn_screen"
            root.reset_score()


<Buttons>:
    name: "btn_screen"
    btn: btn
    on_enter:
        Clock.schedule_once(root.change_screen, 5)

    Button:
        background_normal: "pepe11.png"
        background_down: "pepe11.png"
        id: btn
        size_hint: 0.2, 0.3
        pos_hint: {"x": .4, "y": .35}
        on_press:
            root.respawn()

и поэтому моя проблема с командой Clock.schedule_once, которую я пытаюсь вызвать при входе в экран кнопок, я просто получаю «TypeError: change_screen () принимает 1 позиционный аргумент, но 2 задано».

Спасибо всем заранее.

Ответы [ 2 ]

1 голос
/ 24 апреля 2019

У вас есть 2 ошибки:

  1. Clock.schedule_once() передает в качестве аргумента интервал времени для обратного вызова, поэтому необходимо передать дополнительный параметр.

  2. WindowManager.current недопустимо, поскольку current не является статическим атрибутом, поэтому вы должны обращаться к нему через объект, в случае экрана вы можете получить доступ к ScreenManager, который управляет им через manager свойство.

Таким образом, решение:

# ...
class Buttons(Screen):
    def change_screen(self, dt):
        self.manager.current = "start_screen"
# ...
0 голосов
/ 24 апреля 2019

Часы использует аргумент dt (дельта-время) для функции обратного вызова.
Вы должны изменить свою функцию следующим образом:

def change_screen(self, dt):
    WindowManager.current = "start_screen"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...