【发布时间】:2016-03-15 01:57:52
【问题描述】:
我希望有一个 kivy 应用程序功能作为其他 kivy 应用程序的启动器,具体取决于输入。我在下面实现它的方式显然不起作用(因为kv 文件被重新加载并且它的样式被重新应用,因此添加了越来越多的按钮),而且当我点击Esc 时,跟踪暗示似乎也有一些递归。退出。
我确实收到app1.kv 被多次加载的警告,但是,在App.load_kv() 的文档中它说
如果没有,则在应用程序第一次运行时调用此方法 之前已经为此应用构建了小部件树。
这对我来说意味着应该可以多次run() 一个应用程序?
这是我的代码:
main.py
from kivy.uix.widget import Widget
from kivy.uix.gridlayout import GridLayout
from kivy.app import App
from kivy.properties import ObjectProperty
from kivy.uix.button import Button
from kivy.clock import Clock
from kivy.logger import Logger
from kivy.lang import Builder
class OutsideApp(App):
current_app = ObjectProperty(None)
def build(self):
Clock.schedule_interval(self.update, 3)
return Widget()
def update(self, dt):
if isinstance(self.current_app, App):
self.current_app.stop()
if isinstance(self.current_app, App1):
self.current_app = App2()
else:
self.current_app = App1()
self.current_app.run()
class App1(App):
pass
class App2(App):
def build(self):
gl = Builder.load_string("<SequencesGame@GridLayout>:\n cols: 2\n Button:\n text: \"hello 2\"\nSequencesGame:")
return gl
if __name__ == '__main__':
oa = OutsideApp()
oa.run()
app1.kv
#:kivy 1.0.9
<SequencesGame@GridLayout>:
cols: 2
Button:
text: "hello 111"
SequencesGame:
即使应用没有嵌套,这似乎也是个问题:
main2.py
from kivy.app import App
from kivy.clock import Clock
from kivy.logger import Logger
from kivy.lang import Builder
class App1(App):
pass
class App2(App):
def build(self):
return Builder.load_string("<SequencesGame@GridLayout>:\n cols: 2\n Button:\n text: \"hello 2\"\nSequencesGame:")
current_app = None
def switch(*args):
global current_app
if isinstance(current_app, App):
current_app.stop()
if isinstance(current_app, App1):
current_app = App2()
else:
current_app = App1()
current_app.run()
if __name__ == '__main__':
Clock.schedule_interval(switch, 2)
switch()
【问题讨论】:
-
你不能在屏幕管理器下只拥有一个具有多个屏幕的应用程序,每个屏幕是另一个应用程序''?
-
我想重用现有的应用程序。此外,配置文件之类的东西似乎很好地封装在应用程序级别。
-
为什么不在子进程中运行其他应用程序呢?
-
@inclement 一些数据(特别是网络堆栈)将被共享(网络消息从外向内传递)。不确定这将如何与子流程一起使用。