【问题标题】:Python Spyder initializing Hello World Kivi app once?Python Spyder 一次初始化 Hello World Kivi 应用程序?
【发布时间】:2016-11-12 08:13:15
【问题描述】:

有谁知道为什么 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

但是,通过 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()

【问题讨论】:

标签: python python-2.7 kivy spyder


【解决方案1】:

实际上,示例程序只是您尝试如何以如此简单的方式创建交互式 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

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

【讨论】:

    【解决方案2】:

    参考网页: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()
    

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

    【讨论】:

      【解决方案3】:

      用于外部系统终端将解决此问题。 Part 1

      Part 2

      Part 3

      【讨论】:

      • 我认为答案是正确的,但你应该使用文字描述而不是图像来写你的答案。这就是为什么(很可能)你得到了几票反对的原因。
      猜你喜欢
      • 2017-05-15
      • 2011-06-14
      • 2017-11-14
      • 1970-01-01
      • 1970-01-01
      • 2017-07-06
      • 1970-01-01
      • 1970-01-01
      • 2015-10-16
      相关资源
      最近更新 更多