【问题标题】:Kivy app won't run twice due to ArgumentError由于 ArgumentError,Kivy 应用程序不会运行两次
【发布时间】:2020-04-14 14:33:03
【问题描述】:

我是 kivy GUI 包的新手,想按照官方网站上的“乒乓游戏教程”学习制作游戏。我输入了基本代码以打开一个运行良好的 GUI 窗口。但是,当我关闭此窗口并再次重新运行相同的代码时,我得到一个 ArgumentError。我正在使用最新版本的 Spyder 作为 IDE 并更新了所有软件包。

唯一可以绕过这个问题的方法是重新启动 Spyder。我在执行过程中做错了吗?

代码每次执行时都应该打开一个新窗口。第一次运行后,我得到了这个控制台输出,但是它以 ArgumentError 结尾。

代码:

from kivy.app import App
from kivy.uix.widget import Widget


class PongGame(Widget):
    pass


class PongApp(App):
    def build(self):
        return PongGame()


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

控制台输出

[INFO   ] [Base        ] Start application main loop
[ERROR  ] [Base        ] No event listeners have been created
[ERROR  ] [Base        ] Application will leave
[INFO   ] [Base        ] Leaving application in progress...
[INFO   ] [Base        ] Leaving application in progress...
Traceback (most recent call last):

  File "<ipython-input-2-30ebdb31c7db>", line 17, in <module>
    PongApp().run()

  File "C:\Users\almig\Anaconda3\lib\site-packages\kivy\app.py", line 855, in run
    runTouchApp()

  File "C:\Users\almig\Anaconda3\lib\site-packages\kivy\base.py", line 506, in runTouchApp
    stopTouchApp()

  File "C:\Users\almig\Anaconda3\lib\site-packages\kivy\base.py", line 521, in stopTouchApp
    EventLoop.close()

  File "C:\Users\almig\Anaconda3\lib\site-packages\kivy\base.py", line 172, in close
    self.stop()

  File "C:\Users\almig\Anaconda3\lib\site-packages\kivy\base.py", line 184, in stop
    provider.stop()

  File "C:\Users\almig\Anaconda3\lib\site-packages\kivy\input\providers\wm_pen.py", line 111, in stop
    SetWindowLong_WndProc_wrapper(self.hwnd, self.old_windProc)

  File "C:\Users\almig\Anaconda3\lib\site-packages\kivy\input\providers\wm_common.py", line 122, in _closure
    oldAddr = func(hWnd, GWL_WNDPROC, cast(wndProc, c_void_p).value)

ArgumentError: argument 3: <class 'TypeError'>: wrong type

【问题讨论】:

  • 抛出错误的代码是我写的(修复stackoverflow.com/questions/55928463/…时)。我尝试使用 KivyPython 3.7 VEnvs (64bit / 32bit) 上重现它> 包含修复的版本,但它可以工作。可能是初始化问题?
  • 很抱歉问了这样一个菜鸟问题,但是你在什么时候假设一个初始化问题? kivy包导入?间谍IDE?我在页面和 youtube 上浏览了很多 kivy 教程,但几乎所有教程都只使用这些基本的代码片段。
  • 我假设在某些时候,self.old_windProc 变为 None (0)。那会产生这个错误。该成员在 start 方法中初始化。我猜这只是第一次。不幸的是,我不知道关闭窗口时 Spyder 会做什么。我可以在 Kivy 方面看到一个微不足道的修复,但我不确定这是受支持的方案。
  • 这听起来像是 Kivy 中的一个错误,它是由 spyder 的半不寻常行为触发的 - 看起来 Kivy 没有正确清理自身,因此您无法在运行后运行第二个应用程序第一次返回。这通常无关紧要,但在这里是一个问题,因为 spyder 正在重用相同的解释器实例。它是否可以选择每次运行一个新的 python 进程?

标签: python kivy spyder


【解决方案1】:

您可以让 spyder 每次执行时都运行一个新进程。转到“运行”菜单并选择“每个文件的配置...”(Ctrl+F6)并选择“控制台”下的“在外部系统终端中执行”。

【讨论】:

    【解决方案2】:

    只需转到菜单 --> 运行 --> 每个文件的配置 --> 在外部系统终端中执行 --> 确定。

    应该可以的

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-12
      • 2012-08-18
      • 2016-08-29
      • 1970-01-01
      • 2012-04-03
      • 2018-10-14
      • 2016-09-21
      • 1970-01-01
      相关资源
      最近更新 更多