gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 09:48:48 24 4
gpt4 key购买 nike

我的主类返回一个 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 的实例移至 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()

ma​​intest.kv:

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

<MainScreenApp@Screen>:
LayoutWithButton:

<RootWidget>:
MainScreenApp:
name: "main"

关于具有预定义布局的 Python Kivy 屏幕管理器不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48764561/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com