【问题标题】:Python - Kivy: Change and keep kv file values using function from another classPython - Kivy:使用另一个类的函数更改和保留 kv 文件值
【发布时间】:2019-12-31 14:28:17
【问题描述】:

我目前正在尝试根据我之前从屏幕获得的值更改 .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

类/屏幕 LoginScreen 确实有一个 TextInput 小部件,它从一个人那里获取一个电子邮件地址。然后 .kv 文件中的 LabelButton 确实调用了根函数“get_started”,然后该函数将人的输入邮件 (ids.login_mail.text) 作为参数调用位于query.py(用于从数据库中获取值)。结果是一个列表,其中包含值名称、性别、城市(链接到该人的电子邮件地址)。通过使变量成为全局变量,我尝试在类/屏幕 DisplayScreen 中调用函数“get_data”。 DisplayScreen 确实包含微调器,然后应该自动将变量(名称、性别、城市)作为默认文本。然后屏幕应显示三个值,用户可以使用微调器更改值并更新他的数据。但是它确实运行,没有向我显示任何错误,并且仍然没有更改 DisplayScreen 中的微调器文本。我认为问题在于,即使文本更新有效,screen_change 也总是用默认值覆盖更改(通过加载默认的 .kv 文件)。在默认的 .kv 文件中,微调器文本只是设置为“微调器 A”、“微调器 B”和“微调器 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

【问题讨论】:

  • 换屏并没有重新加载'kv'文件,所以肯定有别的事情发生了。
  • 但是,您的 DisplayScreen().get_data() 正在创建一个未显示在 GUI 中的 DisplayScreen 的新实例。

标签: python class kivy global-variables kivy-language


【解决方案1】:

设法解决了问题。 我摆脱了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')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-16
    • 2022-09-27
    • 2020-04-16
    • 1970-01-01
    • 2018-05-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多