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