簡體   English   中英

具有預定義布局的Python Kivy屏幕管理器不起作用

[英]Python Kivy Screen manager with predefined Layout doesn't work

我的Main類返回ScreenManager的實例。 這個ScreenManager有一個帶有Screen類的窗口小部件,我希望這個Screen類使用一個窗口小部件,它是我之前定義的Layout。

當我執行代碼時,它只顯示黑屏,沒有更多信息。 它應該顯示一個按鈕。

這是我的文件minimum.py

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

class LayoutWithButton(BoxLayout):

    def __init__(self, **kwargs):
        super(LayoutWithButton, self).__init__(**kwargs)

class MainScreenApp(Screen):

    def __init__(self, **kwargs):
        super(MainScreenApp, self).__init__(**kwargs)
        button_layout = LayoutWithButton()
        self.add_widget(button_layout)

screen_manager = ScreenManager()
screen_manager.add_widget(MainScreenApp(name='main'))

class TestMainApp(App):

    def build(self):
        return screen_manager

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

這是我的文件testmain.kv

<LayoutWithButton>:
    Button:
        text: 'hello'

即便如此,如果我將類MainScreenApp的self.add_widget(button_layout)行替換為self.add_widget(Button())則效果很好。

我究竟做錯了什么?

問題是在初始化TestMainApp之前,不會加載kv文件。 在此之前實例化MainScreenApp ,kv中定義的規則無效。

一個非常簡單的解決方案是將MainScreenApp實例MainScreenApp App子類:

class MainApp(App):

    def build(self):
        screen_manager = ScreenManager()
        screen_manager.add_widget(MainScreenApp(name='main'))
        return screen_manager

您還可以在實例化之前強制kv加載:

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


class LayoutWithButton(BoxLayout):
    pass


class MainScreenApp(Screen):

    def __init__(self, **kwargs):
        super(MainScreenApp, self).__init__(**kwargs)
        button_layout = LayoutWithButton()
        self.add_widget(button_layout)

Builder.load_file("testmain.kv")
screen_manager = ScreenManager()
screen_manager.add_widget(MainScreenApp(name='main'))


class TestApp(App):

    def build(self):
        return screen_manager


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

另一種選擇是在kv中執行所有操作:

from kivy.uix.screenmanager import ScreenManager
from kivy.app import App


class RootWidget(ScreenManager):
    pass


class MainTestApp(App):
    def build(self):
        return MainWindow()


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

maintest.kv:

<LayoutWithButton@BoxLayout>:
    Button:
        text: 'hello'

<MainScreenApp@Screen>:
    LayoutWithButton:

<RootWidget>:
    MainScreenApp:
        name: "main"

從testmain.kv中,您應該從類名中刪除該<和>。 您僅在樣式設計時使用它,並且還會多次調用它。

示例您的代碼應如下所示:

 LayoutWithButton: Button: text: 'hello' 

何時使用<和>:

<LayoutWithButton>:
      pos_hint: 0, .5
      Button:
          text: 'hello'

BoxLayout:
    LayoutWithButton:
         pos_hint: 0, .5

祝好運!

暫無
暫無

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

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