【问题标题】:use of ScreenManager in Kivy file and python file在 Kivy 文件和 python 文件中使用 ScreenManager
【发布时间】:2021-01-27 01:45:45
【问题描述】:

我是 Kivy 的新手,我正在开发用于车辆维修的跟踪应用程序,我有一个约会列表,当您按下列表中的某个项目时,我正试图转到另一个屏幕我不知道为什么它对我不起作用,因为它说它在不同的屏幕上但不在应用程序上

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?'

【问题讨论】:

    标签: python kivy kivy-language mobile-application kivymd


    【解决方案1】:

    问题在于,在您的 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
    

    【讨论】:

    • 非常感谢,这个问题困扰了我 2 天
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-27
    • 1970-01-01
    • 1970-01-01
    • 2021-01-24
    相关资源
    最近更新 更多