簡體   English   中英

Kivy BoxLayout 內的嵌套 ScreenManager

[英]Kivy Nested ScreenManager inside BoxLayout

每周都會看到不同風格的東西,在這里我們再次使用更多 ScreenManager 惡作劇 go!

除非按鈕是屏幕本身的一部分,否則屏幕不會改變,我希望在頂部有一個通用導航欄,然后在其下方有一個“顯示”。 兩個屏幕都工作,在它們之間切換的按鈕不工作。

(如果你能告訴我如何使每個屏幕都有自己的 KV 文件並仍然與屏幕管理器鏈接,則可以加分)

無論如何:代碼

QCManager.py

import kivy
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.screenmanager import ScreenManager, Screen, NoTransition

kivy.require('1.9.1')


class MOTD(Screen):
    print("MOTD Screen!")
    pass


class Search(Screen):
    print("Search Screen!")
    pass


class ScreenManagement(ScreenManager):
    pass


class ClassAllScreen(BoxLayout):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.manager = ScreenManagement()


class ClassApp(App):

    def build(self):
        self.root = ClassAllScreen()
        return self.root

if __name__ == '__main__':
    Builder.load_file('./kvfiles/main.kv')
    ClassApp().run()

主文件

#: import NoTransition kivy.uix.screenmanager.NoTransition
<MOTD>:
    name: 'motd'
    BoxLayout:
        orientation:'vertical'
        padding:20
        spacing:10
        Label:
            text:"The Cake Is a Lie"

<Search>:
    name: 'search'
    BoxLayout:
        orientation:'vertical'
        padding:20
        spacing:10
        GridLayout:
            spacing:10
            cols:2

            Button:
                text:'Left'
            Button:
                text:'Right'
        Button:
            text:'bottom'


<ScreenManagement>:
    transition: NoTransition()
    MOTD:
    Search:

<ClassAllScreen>:
    orientation:'vertical'
    BoxLayout:
        size_hint_y: None
        height: 60
        spacing: 5
        padding: 5

        canvas:
            Color:
                rgba: .1,.1,.1,1
            Rectangle:
                pos: self.pos
                size: self.size
        Button:
            text:'Menu'
            size_hint_x: None
            width: 120
            on_release: root.manager.current = 'motd'
        Button:
            text:'Search'
            size_hint_x: None
            width: 120
            on_release: root.manager.current = 'search'
        Button:
            text:'Add to DB'
            size_hint_x: None
            width: 120
            on_press: print("Button Working")
    ScreenManagement:

ClassAllScreen class 中的__init__()方法正在創建ScreenManagement的實例。 該實例保存為self.manager ,但不會添加到您的 GUI 中。

在您的kv文件中,該行:

ScreenManagement:

正在創建另一個不同的ScreenManagement實例。 ScreenManagement實例是您的 GUI 中的實例。

因此,您對self.manager中的ClassAllScreen所做的任何事情都不會影響 GUI 中的ScreenManagement

解決方法是確保您引用了正確的ScreenManagement實例(而不是創建任何其他實例)。 為此,您可以在kv文件中將ObjectProperty添加到ClassAllScreen ,如下所示:

<ClassAllScreen>:
    manager: scr_manager  # added ObjectProperty that references the scr_manager id
    orientation:'vertical'
    BoxLayout:
        size_hint_y: None
        height: 60
        spacing: 5
        padding: 5

        canvas:
            Color:
                rgba: .1,.1,.1,1
            Rectangle:
                pos: self.pos
                size: self.size
        Button:
            text:'Menu'
            size_hint_x: None
            width: 120
            on_release: root.manager.current = 'motd'
        Button:
            text:'Search'
            size_hint_x: None
            width: 120
            on_release: root.manager.current = 'search'
        Button:
            text:'Add to DB'
            size_hint_x: None
            width: 120
            on_press: print("Button Working")
    ScreenManagement:
        id: scr_manager  # new id to enable reference to this ScreenManagement instance

然后ClassAllScreen class 可以簡化為:

class ClassAllScreen(BoxLayout):
    pass

只是為了幫助任何試圖做同樣的事情的人。 固定代碼如下

應用程序.py

import kivy
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.screenmanager import ScreenManager, Screen, NoTransition

kivy.require('1.9.1')


class MOTD(Screen):
    print("MOTD Screen!")
    pass


class Search(Screen):
    print("Search Screen!")
    pass


# class ScreenManagement(ScreenManager):
    # pass  # Removed, Instanced in kv


class ClassAllScreen(BoxLayout):
    pass  # Removed code, Done in kv


class ClassApp(App):
    def build(self):
        self.root = ClassAllScreen()
        return self.root

if __name__ == '__main__':
    Builder.load_file('./kvfiles/main.kv')
    ClassApp().run()

主文件

#: import NoTransition kivy.uix.screenmanager.NoTransition
<MOTD>:
    name: 'motd'
    BoxLayout:
        orientation:'vertical'
        padding:20
        spacing:10
        Label:
            text:"The Cake Is a Lie"

<Search>:
    name: 'search'
    BoxLayout:
        orientation:'vertical'
        padding:20
        spacing:10
        GridLayout:
            spacing:10
            cols:2

            Button:
                text:'Left'
            Button:
                text:'Right'
        Button:
            text:'bottom'


<ClassAllScreen>:
    manager:scr_manager
    orientation:'vertical'
    BoxLayout:
        size_hint_y: None
        height: 60
        spacing: 5
        padding: 5

        canvas:
            Color:
                rgba: .1,.1,.1,1
            Rectangle:
                pos: self.pos
                size: self.size
        Button:
            text:'Menu'
            size_hint_x: None
            width: 120
            on_release: root.manager.current = 'motd'
        Button:
            text:'Search'
            size_hint_x: None
            width: 120
            on_release: root.manager.current = 'search'
        Button:
            text:'Add to DB'
            size_hint_x: None
            width: 120
            on_press: print("Button Working")
    ScreenManager:
        transition: NoTransition()
        id: scr_manager
        MOTD:
        Search:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM