[英]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.