繁体   English   中英

在 Kivy 文件和 python 文件中使用 ScreenManager

[英]use of ScreenManager in Kivy file and python file

我是 Kivy 的新手,我正在开发用于车辆维修的跟踪应用程序,我有一个约会列表,我正在尝试 go 到另一个屏幕,当你按下列表上的一个项目时我没有关于为什么它对我不起作用的线索,因为它说它在不同的屏幕上但不在应用程序上

from kivymd.app import MDApp
from kivy.lang.builder import Builder
from kivymd.uix.list import ThreeLineAvatarIconListItem
from kivymd.uix.list import ImageLeftWidget
from kivy.uix.screenmanager import Screen, ScreenManager, SwapTransition, CardTransition
from kivy.core.window import Window
import sqlite3

DatabaseConnection = sqlite3.connect('CarWorkshopDB.db')
cursor = DatabaseConnection.cursor()

Window.size= (400, 650)

class MainScreen(Screen):
    pass

class AddScreen(Screen):
    pass

class DetailsScreen(Screen):
    pass

class WorkApp(MDApp):
    def build(self):
        self.screen_manager = ScreenManager(transition=CardTransition())
        self.screen_manager.add_widget(MainScreen(name='MainScreen'))
        self.screen_manager.add_widget(AddScreen(name='AddScreen'))
        self.screen_manager.add_widget(DetailsScreen(name='DetailsScreen'))
        screen = Builder.load_file("test2.kv")
        return screen

    def on_start(self):
        client = 'John smith'
        cursor.execute("SELECT TrackingNumber, Plate, Status FROM Appointments WHERE Customer =?", (client,))
        for i in cursor:
            self.new_message(i[0], i[1], i[2])
    
    def new_message(self, TrackingNumber, Vehicle, Process):
        new_message = ThreeLineAvatarIconListItem(text=TrackingNumber, secondary_text=Vehicle, tertiary_text=Process)
        new_message.add_widget(ImageLeftWidget(source='RepairIMG.jpg'))
        new_message.bind(on_release=self.on_touch_down)
        self.root.ids.list.add_widget(new_message)
        
    def on_touch_down(self, x):
        print(self.screen_manager.current)
        self.screen_manager.current = "DetailsScreen"
        self.screen_manager.transition.direction = 'right'
        print(self.screen_manager.current)
WorkApp().run()

这是kv文件中的列表代码

    NavigationLayout:
        ScreenManager:
            id: screen_manager
            MainScreen:
                name : "MainScreen"
                BoxLayout:
                    orientation:'vertical'
                    MDBottomNavigation:
                        panel_color: 1, .643, 0, 1
                        MDBottomNavigationItem:
                            name: 'screen 1'
                            text: 'Home'
                            icon: 'alpha-h-circle'
                            MDToolbar:
                                title: 'Add Repair'
                                md_bg_color: 1, .643, 0, 1
                                elevation: 6
                                pos_hint: {'top':1}
                            Widget:
                        MDBottomNavigationItem:
                            name: 'screen 2'
                            text: 'Track'
                            icon: 'alpha-t-circle'
                            MDToolbar:
                                id: toolbar
                                title: 'Track History'
                                md_bg_color: 1, .643, 0, 1
                                elevation: 6
                                pos_hint: {'top':1}
                            NavigationLayout:
                                x: toolbar.height
                                size_hint_y: 1.0 - toolbar.height/root.height
                                ScreenManager:
                                    Screen:
                                        name: 'ScrollViewScreen'
                                        ScrollView:
                                            MDList:
                                                id: list
                            MDFloatingActionButton:
                                icon: 'plus'
                                md_bg_color: 1, .643, 0, 1
                                on_release: 
                                    screen_manager.current = 'AddScreen'
                                    screen_manager.transition = CardTransition()
                                    screen_manager.transition.direction = "down"
                                pos_hint: {'x': .84, 'y': .02}
                        MDBottomNavigationItem:
                            name: 'screen 4'
                            text: 'More'
                            icon: 'dots-horizontal'
                            MDToolbar:
                                title: 'More'
                                md_bg_color: 1, .643, 0, 1
                                elevation: 6
                                pos_hint: {'top':1}
                            Widget:
                            MDLabel:
                                text: 'dfsfdsf'
                                halign: 'center'
                    
            AddScreen:
                name: 'AddScreen'
                id: Add
                FloatLayout:
                    orientation: 'vertical'
                    MDToolbar:
                        id: toolbar2
                        title: 'Add Tracking Number'
                        md_bg_color: 1, .643, 0, 1
                        elevation: 6
                        pos_hint: {'top':1}
                    MDIconButton:
                        icon : 'close'
                        pos_hint : {'top':0.98, 'x':0.85}
                        on_release : 
                            screen_manager.current = "Main"
                            screen_manager.transition = CardTransition()
                            screen_manager.transition.direction = "up"
                    FloatLayout:
                        x: toolbar2.height
                        size_hint_y: 1.0 - toolbar.height/root.height
                        ScatterLayout:
                            MDLabel:
                                text: 'Track Repair'
                                font_style: 'H4'
                                valign: 'top'
                                pos_hint: {'top':1}
                                text_size: self.size
                                size_hint: None, None
                            MDTextFieldRound:
                                icon_left: 'alpha-t-circle'
                                hint_text: 'Tracking Number'
                                normal_color: 1, .643, 0, 1
                                pos_hint: {'y':.7}
                                text_size: self.size
                            MDTextFieldRound:
                                icon_left: 'alpha-p-circle'
                                hint_text: 'Postcode'
                                normal_color: 1, .643, 0, 1
                                pos_hint: {'y':.6}
                                text_size: self.size
                            MDTextButton:
                                text: "Cant find your tracking number?"
                                custom_color: 1, .643, 0, 1
                                pos_hint: {'y':.5}
                                halign: 'center'
                            MDRectangleFlatButton:
                                text: 'confirm'
                                pos_hint: {'y':.4}
                                valign: 'middle'
                                text_size: self.size
            
            DetailsScreen:
                name: 'DetailsScreen'
                id: Details
                BoxLayout:
                    orientation: 'vertical'
                    MDLabel:
                        text: 'details Screen?'

问题是在您的build()方法中,您正在以下行中构建一个小部件树:

    self.screen_manager = ScreenManager(transition=CardTransition())
    self.screen_manager.add_widget(MainScreen(name='MainScreen'))
    self.screen_manager.add_widget(AddScreen(name='AddScreen'))
    self.screen_manager.add_widget(DetailsScreen(name='DetailsScreen'))

但是您的 GUI 中不使用此小部件树。 GUI 中的小部件树是通过以下方式从kv文件构建的:

screen = Builder.load_file("test2.kv")

当您的代码尝试使用以下方法更改当前Screen时:

self.screen_manager.current = "DetailsScreen"

它正在更改不在您的 GUI 中的ScreenManager的当前Screen

解决方法是为self.screen_manager分配正确的值,如下所示:

class WorkApp(MDApp):
    def build(self):
        screen = Builder.load_file("test2.kv")
        self.screen_manager = screen.ids.screen_manager
        return screen

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM