Python-Kivy:使用另一个类的函数更改和保留kv文件值

问题描述 投票:0回答:1

我目前正在尝试更改.kv文件的值(例如Spinner小部件的文本)-更改屏幕时-基于我之前从屏幕上获取的值。那就是我的设置(简化)的样子:

mail = ''
name = ''
gender = ''
city = ''

class LoginScreen(Screen):
    def get_started(self):
        global mail
        global name
        global gender
        global city
        mail = self.ids.login_mail.text
        data_person = queries.fetch_data(mail)
        name = data_person[0]
        gender = data_person[1]
        city = data_person[2]
        MainApp().change_screen('DisplayScreen')
        DisplayScreen().get_data()

class DisplayScreen(self):
    def get_data(self):
        global mail
        global name
        global gender
        global city
        self.ids.spinner_name.text = name
        self.ids.spinner_gender.text = gender
        self.ids.spinner_city.text = city

Class / Screen LoginScreen确实具有TextInput小部件,该小部件可接收来自某个人的电子邮件地址。然后,.kv文件中的LabelButton确实调用了根函数“ get_started”,该函数随后接收人的输入邮件(ids.login_mail.text),并将其作为参数来调用位于目录中的函数“ fetch_data”。 query.py(用于从数据库获取值)。结果是一个列表,其中确实包含值名称,性别,城市(链接到该人的电子邮件地址)。通过将变量设置为全局变量,我尝试在类/屏幕DisplayScreen中调用函数“ get_data”。 DisplayScreen确实包含微调框,然后应自动将变量(名称,性别,城市)作为默认文本。然后,屏幕应显示三个值,此人可以使用微调框更改这些值并更新其数据。但是它可以运行,不会显示任何错误,并且仍然不会更改DisplayScreen中的微调框文本。我认为问题在于,即使文本更新有效,screen_change也会始终使用默认值(通过加载默认的.kv文件)覆盖更改。在默认的.kv文件中,微调器文本仅设置为“ Spinner A”,“ Spinner B”和“ Spinner C”。如果我在self.ids.spinner_name.text = name更新之前在DisplayScreen类中放置了一个print(name),它将在控制台中正确地向我显示name值。因此,正确的值是可用的,它在保持.kv文件更新而不会恢复为默认值方面存在问题。

Screen_Change函数(在MainApp类中定义):

def change_screen(self, screen_name):
    screen_manager = GUI.ids['screen_manager']
    screen_manager.transition = NoTransition()
    screen_manager.current = screen_name
python class kivy global-variables kivy-language
1个回答
0
投票

设法解决问题。我摆脱了DisPlayScreen().get_data()功能,并已将这些值分配给LoginScreen().get_started()中的DisplayScreen。

通过使用GUI.ids.display_screen.ids.spinner_name.text = name,我可以访问和编辑.kv文件(其中display_screen是我的kv文件的名称)

LoginScreen(仅用于变量名):

class LoginScreen(Screen):
    def get_started(self):
        global mail
        mail = self.ids.login_mail.text
        global name
        data_person = queries.fetch_data(mail)
        name = data_person[0]
        GUI.ids.display_screen.ids.spinner_name.text = name
        MainApp().change_screen('DisplayScreen')
© www.soinside.com 2019 - 2024. All rights reserved.