Как изменить поведение метки из другого класса в киви

#python #kivy

Вопрос:

Я хочу создать страницу с формой и кнопкой отправки, которая при нажатии приведет вас на другую страницу, на которой будут показаны данные, вводимые со страницы формы.

Я создал форму 2 класса и профиль, но когда я нажал кнопку формы, она приведет вас на страницу профиля, но ничего не изменится.

Я перепробовал так много вещей, но не смог этого сделать, пожалуйста, помогите.

файл .py

 from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.properties import ObjectProperty
from kivy.uix.widget import Widget
from kivy.core.window import Window
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen



class Manager(ScreenManager):
    pass

class Profile(Screen):
    profile_name = ObjectProperty()
    profile_matric = ObjectProperty()
    profile_school = ObjectProperty()
    profile_programme = ObjectProperty()
    profile_level = ObjectProperty()
    
    def make_changes(self):
        self.ids.profile_name = 'New name'
        

class Form(Screen):
    user_name = ObjectProperty()
    matric = ObjectProperty()
    school = ObjectProperty()
    programme = ObjectProperty()
    level = ObjectProperty()
    
    
    def submit(self):
        y = Profile()
        y.make_changes()

kv = Builder.load_file('main.kv')

class SpinApp(App):
    def build(self):
        return kv
        
if __name__ == '__main__':
    SpinApp().run()
 

файл .kv

 Manager:
    Form:
    Profile:


<Form@BoxLayout>:
    name: 'form'
    orientation: 'vertical'
    
    user_name: user_name
    matric: matric
    school: school
    programme: programme
    level: level
    
    RelativeLayout:
        GridLayout: 
            cols: 1
            #size_hint: (0.8, 0.8)
            spacing: 5
            padding: [20]
            pos_hint: {'center_x':.5, 'center_y':.5}
            background_normal: ''
        
    
            GridLayout:
                cols: 2
                Label:
                    text: 'nName'
                    size_hint_x: None
                    size: self.texture_size
                    pos_hint: {'left': 1}
                    bold: True
                    size_hint_y: None
                    height: 80
                Input_text:
                    id: user_name
                    hint_text: 'enter your full name'
            
            GridLayout:
                cols: 2     
                Input_label:
                    text: 'nMatric Number'
                Input_text:
                    id: matric
                    hint_text: 'eg. se/mat-csc/19/0000'
            
            GridLayout:
                cols: 2
                Input_label:
                    text: 'nSchool'
                Input_text:
                    id: school
                    hint_text: 'your school'
                    
            GridLayout:
                cols: 2
                Input_label:
                    text: 'nLevel'
                Input_text:
                    id: level
                    hint_text: 'Enter your level'
                
            GridLayout:
                cols: 2
                Input_label:
                    text: 'nProgramme'
                Input_text:
                    id: programme
                    hint_text: 'type your programme'
                    
            Button:
                text: 'submit'
                on_release:
                    app.root.current = 'profile'
                    root.submit()
                


<Profile@BoxLayout>:
    name: 'profile'
    orientation: 'vertical'
    
    profile_name: profile_name
    profile_matric: profile_matric
    profile_level: profile_level
    profile_school: profile_school
    profile_programme: profile_programme

    RelativeLayout:
        GridLayout: 
            cols: 1
            size_hint: (0.8, 0.8)
            spacing: 5
            padding: [20]
            pos_hint: {'center_x':.5, 'center_y':.5}
            background_normal: ''
            canvas.before:
                Color:
                    rgba:  (253/255, 245/255, 230/255, 1)
                RoundedRectangle:
                    size: self.size
                    pos: self.pos
                    radius: [15]
                    
                
            
            Image:
                source: 'slde_1.png'
                size: self.texture_size
            
            profile_label:
                id: profile_name
                text: 'Name: '
            profile_label:
                id: profile_matric
                text: 'Matric no.:'
            profile_label:
                id: profile_level
                text: 'Level:'
            profile_label:
                id: profile_school
                text: 'School:'
            profile_label:
                id: profile_programme
                text: 'Programme:'
        

<profile_label@Label>:
    color: 1,1,1,1
    bold: True
    font_size: 30
    size_hint_y: None
    height: 85
    text_size: self.size
    halign: 'left'
    valign: 'middle'
    padding: [10,0]
    canvas.before:
        Color:
            rgba:  47/255, 79/255, 79/255, 1
        RoundedRectangle:
            size: self.size
            pos: self.pos
            radius: [25]

<Input_label@Label>:
    size_hint_x: None
    size: self.texture_size
    pos_hint: {'left': 1,}
    size_hint_y: None
    height: 80
    bold: True
    
<Input_text@TextInput>:
    multiline: False
    size_hint_y: None
    height: 80
    padding: [10,20]
    background_normal: ''
    background_color: 240/255, 248/255, 1, 1
    valign: 'bottom'
 

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

1. inclem.net/2019/06/20/kivy/…

Ответ №1:

В свой Profile класс вы можете добавить on_enter() метод. on_enter() Метод выполняется каждый раз при Profile Screen вводе. Так что что-то вроде этого:

 class Profile(Screen):
    profile_name = ObjectProperty()
    profile_matric = ObjectProperty()
    profile_school = ObjectProperty()
    profile_programme = ObjectProperty()
    profile_level = ObjectProperty()

    def on_enter(self, *args):
        form = self.manager.get_screen('form')
        self.profile_name.text = form.user_name.text
        self.profile_matric.text = form.matric.text
        self.profile_school.text = form.school.text
        self.profile_programme.text = form.programme.text
        self.profile_level.text = form.level.text
 

Тогда в вашем kv , submit Button можете просто изменить Screen :

         Button:
            text: 'submit'
            on_release:
                app.root.current = 'profile'
 

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

1. Спасибо, именно то, что мне было нужно, очень ценю