Python Spyder初始化Hello World Kivi应用程序一次?

Mau*_*oto 6 python python-2.7 spyder kivy

有谁知道为什么Python的2.7 Spyder只是成功初始化'Hello World'Kivy应用程序一次,即点击F5会带来窗口应用程序,但当我关闭它并再次点击F5时,它会显示以下错误:

[INFO              ] [Base        ] Start application main loop
[ERROR             ] [Base        ] No event listeners have been created
[ERROR             ] [Base        ] Application will leave
Run Code Online (Sandbox Code Playgroud)

但是,通过Anacondas命令提示符初始化时没有错误.

这是代码(与网站相同):

from kivy.app import App
from kivy.uix.button import Button

class TestApp(App):
    def build(self):
        return Button(text='Hello World')

TestApp().run()

if __name__ == '__main__':
    TestApp().run()
Run Code Online (Sandbox Code Playgroud)

MaT*_*MaX 8

实际上,示例程序只是一个最小的结构,您可以尝试以这种简单的方式创建交互式UI.

而在TestApp,它实际上并没有影响event listerners处理关闭事件.当你创建你的实际项目时,你应该总是照顾它.如果logging仔细观察,你会注意到当你关闭时错误发生了TestApp,而不是当你"重新启动"时TestApp:

[INFO              ] [Base        ] Leaving application in progress...
INFO:kivy:[Base        ] Leaving application in progress...
[INFO              ] [Base        ] Start application main loop
INFO:kivy:[Base        ] Start application main loop
[ERROR             ] [Base        ] No event listeners have been created
ERROR:kivy:[Base        ] No event listeners have been created
[ERROR             ] [Base        ] Application will leave
ERROR:kivy:[Base        ] Application will leave
Run Code Online (Sandbox Code Playgroud)

因此,对于您的情况,一个简单的解决方法是,您Run->ConfigureConsole面板中,而不是您选择Execute in current Python or IPython console,您只需选择第二个选项,即Execute in a new dedicated Python console.在这种情况下,在完成代码的时间,Python将关闭当前内核.无论何时运行代码,Spyder都会自动为此特定脚本创建新的专用内核.


phc*_*en2 5

参考网页:https : //groups.google.com/forum/m/#!topic/ kivy-users/ yfhH7skAEJA,它给出了解决此问题的解决方案,我将代码重写如下,

from kivy.app import App
from kivy.uix.button import Button

class TestApp(App):
   def build(self):
      return Button(text='Hello World')

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] = {}

if __name__ == '__main__':
   reset()
   TestApp().run()
Run Code Online (Sandbox Code Playgroud)

reset() 函数将清理 Window 的状态并正常运行 TestApp()。