использование ScreenManager в файле Kivy и файле python

#python #kivy #kivy-language #mobile-application #kivymd

#python #kivy #kivy-язык #мобильное приложение #kivymd

Вопрос:

Я новичок в 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?'
 

Ответ №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'))
 

Но это дерево виджетов не используется в вашем графическом интерфейсе. Дерево виджетов в вашем графическом интерфейсе создается из kv файла с помощью:

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

Когда ваш код пытается изменить текущее Screen значение с помощью:

 self.screen_manager.current = "DetailsScreen"
 

это изменение текущего Screen ScreenManager параметра, которого нет в вашем графическом интерфейсе.

Исправление заключается в присвоении правильного значения self.screen_manager , например:

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

Комментарии:

1. Большое вам спасибо, эта проблема беспокоила меня 2 дня