首页 > 解决方案 > 为什么屏幕不能以 Kv 语言加载?

问题描述

我有一个应用程序,其固定标题中有三个切换按钮,它是屏幕管理器的外部缩进布局。初始化时,导入屏幕必须显示 ie self.ids.scrn_man.current = 'import_scn",当按下切换按钮时,下一个屏幕应显示 ie on_state: scrn_man.current = "settings_scrn"

但是由于某种原因,只有标题显示并且屏幕不想转换。我没有收到任何错误。

我尝试了不同的布局作为我的 Apps 主类继承,包括FloatLayoutStackLayoutBoxLayout. 我还固定了标题,AnchorLayout并使用不同的布局作为ScreenManager. 如果我删除了ScreenManager我会看到我的小部件,但当然,我无法转换。我最初尝试使用 TabbedPanel 来容纳我的不同小部件,但RefError: weak object reference如果我添加了太多小部件,我会遇到一个常量(但现在不是这样)。所以我重新设计了一些我知道在以前的应用程序上工作过的东西,尽管不那么复杂。

这是我的错误代码:

from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.stacklayout import StackLayout
from kivy.uix.togglebutton import ToggleButton
from kivy.lang import Builder
from kivy.uix.popup import Popup
from kivy.properties import StringProperty, ObjectProperty

Builder.load_string("""
<RoundedButton@Button>:
    background_color: 0,0,0,0
    canvas.before:
        Color:
            rgba: (.47,.47,.47,1) if self.state=='normal' else (1,.6,0,1) 
        RoundedRectangle:
            pos: self.pos
            size: self.size
            radius: [8,]
<RoundedCancelButton@Button>:
    background_color: 0,0,0,0
    canvas.before:
        Color:
            rgba: (.47,.47,.47,1) if self.state=='normal' else (1,.2,.2,1) 
        RoundedRectangle:
            pos: self.pos
            size: self.size
            radius: [8,]
<RoundedAcceptButton@Button>:
    background_color: 0,0,0,0
    canvas.before:
        Color:
            rgba: (.47,.47,.47,1) if self.state=='normal' else (.2,1,.6,1) 
        RoundedRectangle:
            pos: self.pos
            size: self.size
            radius: [8,]

<TabbedContainer@ToggleButton>:
    background_color: (1, .5, 0, 1)
    background_normal: ''
    size_hint_y: None
    height: 50
    size_hint_x: (1 / 3)
    spacing: 30
<Tab>:
    canvas.before:
        Color:
            rgba: (.89, .89, .89, 1)
        Rectangle:
            size: self.size
            pos: self.pos
    orientation: 'lr-tb'
    BoxLayout:
        orientation: 'horizontal'
        size_hint_y: None
        height: 30
        canvas.before:
            Color:
                rgba: (1, .3, 0, 1)
            Rectangle:
                size: self.size
                pos: self.pos
        Label:
            text: 'Test'
            color: (1, 1, 1, 1)
            size_hint_x: 1
    StackLayout:
        orientation: 'lr-tb'
        Label:
            text: ''
            size_hint_x: 1
            size_hint_y: None
            height: 10
        TabbedContainer:
            id: import_tog
            text: 'Import'
            state: 'down'
            group: 'admin_navs'
            on_state: root.change_screen(self)
        TabbedContainer:
            id: calculate_tog
            text: 'Calculate'
            group: 'admin_navs'
            on_state: root.change_screen(self)
        TabbedContainer:
            id: settings_tog
            text: 'Settings'
            group: 'admin_navs'
            on_state: root.change_screen(self)
    BoxLayout:
        id: ui_content
        padding: 10
        ScreenManager: #Problem here I think
            id: scrn_man
            Screen:
                id: import_scrn
                name: 'import_scrn'
                StackLayout:
                    orientation: 'lr-tb'
                    Label:
                        text: ''
                        size_hint_x: 1
                    Label:
                        text: ''
                        size_hint_x: 0.2
                    RoundedButton:
                        text: 'Choose File'
                        size_hint_x: 0.2
                    TextInput:
                        id: get_file
                        readonly: True
                        size_hint_x: 0.5
                    Label:
                        text: ''
                        size_hint_x: 0.1
                    Label:
                        text: ''
                        size_hint_x: 0.2
                    RoundedButton:
                        text: 'Import'
                        size_hint_x: 0.2
                    Label:
                        text: ''
                        size_hint_x: 0.6
                StackLayout:
                    id: import_data_content
                    orientation: 'lr-tb'
                    size_hint_y: None
                    height: 90
            Screen:
                id: calculate_scrn
                name: 'calculate_scrn'
            Screen:
                id: settings_scrn
                name: 'settings_scrn'
                StackLayout:
                    orientation: 'lr-tb'
                    size_hint_x: 0.5
                    Label:
                        text: ''
                        size_hint_x: 0.1
                    Button:
                        text: 'Add Employee'
                        size_hint_x: 0.2
                    Label:
                        text: ''
                        size_hint_x: 0.2
                    Button:
                        text: 'CSV'
                        size_hint_x: 0.2
                    Label:
                        text: ''
                        size_hint_x: 0.3
                BoxLayout:
                    orientation: 'horizontal'
                    size_hint_x: 0.5
                    Label:
                        text: 'In Time'
                        size_hint_x: 0.7
                    TextInput:
                        size_hint_x: 0.3
                    Label:
                        text: 'Out Time'
                        size_hint_x: 0.7
                    TextInput:
                        size_hint_x: 0.3
                        """)
class TabbedContainer(ToggleButton):
    pass

class FileChoosePopup(Popup):
    load = ObjectProperty()

class RoundedButton(Button):
    pass
class RoundedCancelButton(Button):
    pass
class RoundedAcceptButton(Button):
    pass

class Tab(StackLayout):
    file_path = StringProperty("No file chosen")
    the_popup = ObjectProperty(None)
    def __init__(self, **kwargs):
        super().__init__(**kwargs)

        #load import window on initialisation
        import_window = self.ids.import_scrn
        self.ids.scrn_man.current = 'import_scrn'


    def change_screen(self, instance):
        if instance.text == 'Import':
            self.ids.scrn_man.current = 'import_scrn'
        elif instance.text == 'Calculate':
            self.ids.scrn_man.current = 'calculate_scrn'
        else:
            self.ids.scrn_man.current = 'settings_scrn'

class TestApp(App):
    def build(self):
        return Tab()

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

我希望导入屏幕必须在切换按钮上显示初始化和屏幕转换state: down。有人可以就如何使我的应用程序按上述说明行事给我一些建议吗?

标签: pythonpython-3.xuser-interfacekivykivy-language

解决方案


根据您的设置,您的屏幕正在正确加载。您需要查看您的设置来查看整个kv字符串size_hint。检查每个包含子项的项目,并确保size_hint_x其子项的总和小于或等于 1.0 和 相同size_hint_y


推荐阅读