ArgumentError仅在第一次运行后发生

时间:2019-06-11 18:04:24

标签: python anaconda kivy ipython spyder

我将Spyder的IPython控制台中的kivy包用于Anaconda导航器。打开Spyder后,如果我使用runfile(path,wdir = cwd),我的代码将毫无问题地运行。但是在关闭弹出窗口后,如果我再次尝试运行该文件,则会收到错误消息:

   File "C:\Users\Me\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

我是Anaconda的新手,我想知道这里出了什么问题。任何帮助将非常感激。

我使用

在管理员conda终端中重新安装了kivy
conda install -c conda-forge kivy

我创建了一个虚拟应用程序,只有很少的部分来演示该问题。我在下面包含了此代码。

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


class FakeTool(Widget):
    pass


class FakeApp(App):
    def build(self):
        return FakeTool()


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

3 个答案:

答案 0 :(得分:1)

遇到类似的问题,在这篇文章中找到了解决方法:

https://stackoverflow.com/a/55057636/9752709

在再次启动您的应用之前,请使用reset()函数。

if __name__ == '__main__':
    FakeApp().run()
    reset()
    FakeApp().run()
    ...

答案 1 :(得分:1)

在Anaconda上使用kivy运行MyFirstApp时遇到此问题。

此问题已通过运行内核>重新启动并清除输出来解决

希望这会有所帮助。我很确定我们可以在重新执行命令run()之前编写一个命令(如reset())来执行上述任务。

答案 2 :(得分:0)

问题是Kivy使用的全局变量!! 您必须先清理并修复这些问题,然后才能重新启动kivy应用程序。

这可以在Windows kivy应用程序中完成,方法是定义一个reset()函数,该函数在运行应用程序之前进行清理并调用它。

下面的代码应该说明这一点。

from kivy.app import App
from kivy.uix.label import Label
from kivy.uix.gridlayout import GridLayout
from kivy.uix.textinput import TextInput

def reset():
    import kivy.core.window as window
    from kivy.base import EventLoop
    if not EventLoop.event_listeners:
        from kivy.cache import Cache
        window.Window = window.core_select_lib('window', window.window_impl, True)
        Cache.print_usage()
        for cat in Cache._categories:
            Cache._objects[cat] = {}

class MyGrid(GridLayout):
    def __init__(self, **kwargs):
        super(MyGrid, self).__init__(**kwargs)
        self.cols = 2
        self.add_widget(Label(text="First Name: "))
        self.firstName = TextInput(multiline=False)
        self.add_widget(self.firstName)

class MyApp(App):
    def build(self):
        return MyGrid()

if __name__ == "__main__":
    reset()
    app = MyApp()
    app.run()