【问题标题】:KIVY python: ScreenManagerKIVY python:屏幕管理器
【发布时间】:2017-10-12 17:54:29
【问题描述】:

这段代码有什么问题? (它显示一个空屏幕) 我想要 2 个屏幕,每个屏幕上都有 1 个按钮来简单地添加一个小部件(来自 python 代码),以及 1 个按钮来切换到另一个屏幕。 当我运行代码时,我可以看到一个没有按钮和标签的空白屏幕。如何解决所有这些问题?

PS:当我执行以下操作时,它完美地工作:

class MyScreenManager(ScreenManager):
    pass

# ... and

class MyAppli(App):
    def build(self):
        Window.clearcolor=(1,1,1,1)
        return MyScreenManager()

调试.py:

from kivy.app import App
from kivy.core.window import Window
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.uix.label import Label
from kivy.lang import Builder

class MyScreenManager(ScreenManager):
    def initialize(self):   # I know this is not necessary, 
        # but in my real code, i have to proceed like this.

        # ... (some instructions)
        pass

class Menu1(Screen):

    def add_label(self):
        self.add_widget(Label(text="Hello", color=(1,0,0,1)))


class Menu2(Screen):

    def add_label(self):
        self.add_widget(Label(text="Hello", color=(1,0,0,1)))


Builder.load_file("debug.kv")

class MyAppli(App):

    def build(self):
        Window.clearcolor = (1,1,1,1)
        return MyScreenManager().initialize()

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

debug.kv:

#:kivy 1.9.1

<MyScreenManager>:
    Menu1:
        id: menu1
    Menu2:
        id: menu2

<Menu1>:
    name: "screen1"

    BoxLayout:

        Label:
            text:"Screen 1"
            color:(1,0,0,1)


        Button:
            text:"Add a label"
            size:(200,50)
            size_hint:(None,None)
            background_color:(1,0,0,1)
            on_press:
                root.manager.ids.menu1.add_label()

        Button:
            text:"Go to screen 2"
            size:(200,50)
            size_hint:(None,None)
            background_color:(1,0,0,1)
            on_press:
                root.manager.current = "screen2"


<Menu2>:
    name: "screen2"

    BoxLayout:

        Label:
            text:"Screen 2"
            color:(1,0,0,1)    

        Button:
            text:"Add a label"
            size:(200,50)
            size_hint:(None,None)
            background_color:(1,0,0,1)
            on_press:
                root.manager.ids.menu2.add_label()

        Button:
            text:"Go to screen 1"
            size:(200,50)
            size_hint:(None,None)
            background_color:(1,0,0,1)
            on_press:
                root.manager.current = "screen1"

【问题讨论】:

    标签: screen kivy


    【解决方案1】:

    请在 MyScreenManager 类中执行以下操作。详情请参考示例。

    片段

    class MyScreenManager(ScreenManager):
        def __init__(self, **kwargs):
            super(MyScreenManager, self).__init__(**kwargs)
            self.initialize()
    
        def initialize(self):   # I know this is not necessary,
            # but in my real code, i have to proceed like this.
    
            # ... (some instructions)
            print("MyScreenManager.initialize called")
    ...
    class MyAppli(App):
    
        def build(self):
            Window.clearcolor = (1, 1, 1, 1)
            return MyScreenManager()
    

    示例

    debug.py

    ​​>
    from kivy.app import App
    from kivy.core.window import Window
    from kivy.uix.screenmanager import ScreenManager, Screen
    from kivy.uix.label import Label
    from kivy.lang import Builder
    
    
    class MyScreenManager(ScreenManager):
        def __init__(self, **kwargs):
            super(MyScreenManager, self).__init__(**kwargs)
            self.initialize()
    
        def initialize(self):   # I know this is not necessary,
            # but in my real code, i have to proceed like this.
    
            # ... (some instructions)
            print("MyScreenManager.initialize called")
    
    
    class Menu1(Screen):
    
        def add_label(self):
            self.add_widget(Label(text="Hello", color=(1,0,0,1)))
    
    
    class Menu2(Screen):
    
        def add_label(self):
            self.add_widget(Label(text="Hello", color=(1,0,0,1)))
    
    
    Builder.load_file("debug.kv")
    
    
    class MyAppli(App):
    
        def build(self):
            Window.clearcolor = (1, 1, 1, 1)
            return MyScreenManager()
    
    
    if __name__ == '__main__':
        MyAppli().run()
    

    debug.kv

    #:kivy 1.10.0
    
    <MyScreenManager>:
        Menu1:
            id: menu1
        Menu2:
            id: menu2
    
    <Menu1>:
        name: "screen1"
    
        BoxLayout:
    
            Label:
                text:"Screen 1"
                color:(1,0,0,1)
    
    
            Button:
                text:"Add a label"
                size:(200,50)
                size_hint:(None,None)
                background_color:(1,0,0,1)
                on_press:
                    root.manager.ids.menu1.add_label()
    
            Button:
                text:"Go to screen 2"
                size:(200,50)
                size_hint:(None,None)
                background_color:(1,0,0,1)
                on_press:
                    root.manager.current = "screen2"
    
    
    <Menu2>:
        name: "screen2"
    
        BoxLayout:
    
            Label:
                text:"Screen 2"
                color:(1,0,0,1)
    
            Button:
                text:"Add a label"
                size:(200,50)
                size_hint:(None,None)
                background_color:(1,0,0,1)
                on_press:
                    root.manager.ids.menu2.add_label()
    
            Button:
                text:"Go to screen 1"
                size:(200,50)
                size_hint:(None,None)
                background_color:(1,0,0,1)
                on_press:
                    root.manager.current = "screen1"
    

    输出

    Output Apps Running

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-04
      • 1970-01-01
      • 1970-01-01
      • 2019-04-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多