python - Kivy 函数调用中出现意外类型错误

标签 python kivy typeerror

我正在使用 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

阅读this question的答案,关于这个特定的错误,我了解到Python中的方法实际上的实现方式与它们在代码中的显示方式不同。

更准确地说,来自 this comment我知道正确声明方法 write_something 并将其 self 作为参数是正确的方法。另外,来自this answer我知道Python计算的传递参数的数量应该是1+N,其中N是在调用中传递的。不过,我没有在通话中传递任何参数。

那么,有没有与 Kivy 进行过一些无声的争论?我是否以错误的方式调用该方法?

编辑 - 错误堆栈

根据评论的建议,我包含整个错误堆栈:

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

最佳答案

当它连接任何事件时,在这种情况下 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)

关于python - Kivy 函数调用中出现意外类型错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52683291/

相关文章:

python - Openshift 上的 Django - 500 内部服务器错误 - wsgi.py 中的错误

python - 从破折号分隔的字符串创建多级字典(未知多深)

python - 在 Python Cartopy 中向加拿大 map 添加省份

python - 如何使用 Kivy Clock.schedule_once 安排事件

cordova - PhoneGap - 波纹 - 谷歌地图 : Drag Issue

javascript - ui-grid表格PDF导出

python - Django 电子商务中的 URL 安全

python - Kivy 在移动时获取 Widget 在 Scatter 中的位置

python - 运行代码时更新 kivy 小部件的属性

types - Haxe lua.Table<字符串,整数> : String should be Int