Неожиданная ошибка TypeError в вызове функции с Kivy - PullRequest
0 голосов
/ 06 октября 2018

Я использую Kivy с Python 3.5.Я пытаюсь настроить приложение, в котором нажатие кнопки планирует вызов функции.Предпосылка: это мое первое приложение с Kivy, и я не очень хорошо разбираюсь в Python.Вот мой упрощенный код:

class MyApp(App):
    def build(self):
        layout = GridLayout(cols=2)
        TextStream = Label(text = 'Something will be written here: ')
        StartButton = Button(text = 'Start writing')
        StartButton.bind(on_press=lambda x:self.start_program(freq=10))
        layout.add_widget(TextStream)
        layout.add_widget(StartButton)
        return layout

    def start_program(self, freq):
        Clock.schedule_interval(self.write_something, 1.0/freq)
        # Also tried Clock.schedule_interval(self.write_something(), 1.0/freq)

    def write_something(self):
        TextStream.text =+ 'Something '

if __name__ == '__main__':
    MyApp().run()

Когда я запускаю скрипт, я получаю:

TypeError: write_something() takes 1 positional argument but 2 were given

Чтение ответов на на этот вопрос об этой конкретной ошибкеЯ понял, что методы в Python на самом деле реализованы не так, как они появляются в коде.

Точнее, из этого комментария Я понимаю, что правильное объявление метода write_something, предоставляющего ему self в качестве аргумента, является правильным способом сделать это.Также из этого ответа я получаю, что число переданных аргументов, подсчитываемых Python, должно быть 1 + N, где N передается в вызове.Однако я не передаю никаких аргументов в вызове.

Итак, есть ли какие-то беззвучные аргументы, переданные Киви?Я неправильно вызываю метод?

Редактировать - стек ошибок

Как следует из комментария, я включаю весь стек ошибок:

Traceback (most recent call last):

  File "<ipython-input-1-5d17b5569154>", line 1, in <module>
    runfile('/home/raggot/Projects/MyApp/scripts/_test_kivy.py', wdir='/home/raggot/Projects/MyApp/scripts')

  File "/usr/local/lib/python3.5/dist-packages/spyder/utils/site/sitecustomize.py", line 705, in runfile
    execfile(filename, namespace)

  File "/usr/local/lib/python3.5/dist-packages/spyder/utils/site/sitecustomize.py", line 102, in execfile
    exec(compile(f.read(), filename, 'exec'), namespace)

  File "/home/raggot/Projects/MyApp/scripts/_test_kivy_camera.py", line 78, in <module>
    MyApp().run()

  File "/usr/local/lib/python3.5/dist-packages/kivy/app.py", line 826, in run
    runTouchApp()

  File "/usr/local/lib/python3.5/dist-packages/kivy/base.py", line 502, in runTouchApp
    EventLoop.window.mainloop()

  File "/usr/local/lib/python3.5/dist-packages/kivy/core/window/window_pygame.py", line 403, in mainloop
    self._mainloop()

  File "/usr/local/lib/python3.5/dist-packages/kivy/core/window/window_pygame.py", line 289, in _mainloop
    EventLoop.idle()

  File "/usr/local/lib/python3.5/dist-packages/kivy/base.py", line 337, in idle
    Clock.tick()

  File "/usr/local/lib/python3.5/dist-packages/kivy/clock.py", line 581, in tick
    self._process_events()

  File "kivy/_clock.pyx", line 384, in kivy._clock.CyClockBase._process_events

  File "kivy/_clock.pyx", line 414, in kivy._clock.CyClockBase._process_events

  File "kivy/_clock.pyx", line 412, in kivy._clock.CyClockBase._process_events

  File "kivy/_clock.pyx", line 167, in kivy._clock.ClockEvent.tick

TypeError: write_something() takes 1 positional argument but 2 were given

1 Ответ

0 голосов
/ 07 октября 2018

Когда он подключается к какому-либо событию, в этом случае schedule_interval Kivy передает ему дополнительные аргументы, по этой причине он выдает эту ошибку, в вашем случае он использует только args, и у вас нет никаких проблем.В случае Clock он передает dt, который является точным временем вызова.

def start_program(self, freq):
    Clock.schedule_interval(self.write_something, 1.0/freq)

def write_something(self, *args):
    print(args)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...