Python 使用Kivy的嵌套/交替应用程序

Python 使用Kivy的嵌套/交替应用程序,python,kivy,Python,Kivy,我想有一个kivy应用程序功能作为其他kivy应用程序的启动程序,具体取决于输入。我在下面实现它的方式显然不起作用(因为kv文件被重新加载,并且它的样式被重新应用,从而添加了越来越多的按钮),而且当我点击Esc退出时,似乎也有一些递归 我确实收到了一条警告,app1.kv被多次加载,但是在App.load\u kv()的文档中,它说 如果没有,则在第一次运行应用程序时调用此方法 在此应用程序之前已构建小部件树 这对我来说意味着应该可以多次运行一个应用程序 这是我的密码: main.py from

我想有一个kivy应用程序功能作为其他kivy应用程序的启动程序,具体取决于输入。我在下面实现它的方式显然不起作用(因为
kv
文件被重新加载,并且它的样式被重新应用,从而添加了越来越多的按钮),而且当我点击
Esc
退出时,似乎也有一些递归

我确实收到了一条警告,
app1.kv
被多次加载,但是在
App.load\u kv()
的文档中,它说

如果没有,则在第一次运行应用程序时调用此方法 在此应用程序之前已构建小部件树

这对我来说意味着应该可以多次运行一个应用程序

这是我的密码:

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()
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()
来自kivy.uix.widget导入小部件
从kivy.uix.gridlayout导入gridlayout
从kivy.app导入应用程序
从kivy.properties导入ObjectProperty
从kivy.uix.button导入按钮
从kivy.clock导入时钟
从kivy.logger导入记录器
从kivy.lang导入生成器
类外部应用程序(应用程序):
当前应用程序=对象属性(无)
def生成(自):
时钟计划间隔(自我更新,3)
返回小部件()
def更新(自我,dt):
如果存在(自身当前应用,应用):
self.current_app.stop()
如果存在(self.current_app,App1):
self.current_app=App2()
其他:
self.current_app=App1()
self.current_app.run()
类别App1(应用程序):
通过
类别App2(应用程序):
def生成(自):
gl=Builder.load\u字符串(“:\n cols:2\n按钮:\n文本:\“hello 2\”\n序列游戏:”)
返回总帐
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
oa=外部应用程序()
oa.run()
app1.kv

#:kivy 1.0.9
<SequencesGame@GridLayout>:
    cols: 2
    Button:
        text: "hello 111"
SequencesGame:
#:kivy 1.0.9
:
科尔斯:2
按钮:
文字:“你好111”
序列名称:
即使应用程序没有嵌套,这似乎也是一个问题:

main2.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()
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()
从kivy.app导入应用
从kivy.clock导入时钟
从kivy.logger导入记录器
从kivy.lang导入生成器
类别App1(应用程序):
通过
类别App2(应用程序):
def生成(自):
返回生成器。加载\u字符串(“:\n列:2\n按钮:\n文本:\“hello 2\”\n序列游戏:”)
当前应用程序=无
def开关(*args):
全球最新应用程序
如果存在(当前应用程序,应用程序):
当前应用程序停止()
如果isinstance(当前应用程序,应用程序1):
当前_app=App2()
其他:
当前_app=App1()
当前应用程序运行()
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
时钟。计划时间间隔(开关,2)
开关()

最后,我听从了@increment的使用建议。以下是一个基本实现(无需通过管道或队列进行通信):


你不能在screen manager下使用一个应用程序和多个屏幕,其中每个屏幕都是,另一个应用程序“”?我想重用现有的应用程序。此外,像配置文件这样的东西似乎被很好地封装在应用程序级别。为什么不在子进程中运行其他应用程序呢?@糟糕的是,一些数据(特别是网络堆栈)将被共享(网络消息从外到内传递)。不确定这将如何处理子流程。