Kivy无法使用ScreenManager获取文本输入

2024-04-20 05:46:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我在做一个项目,我在用kivy

我想创建一个应用程序,我需要多个页面,因此我正在使用屏幕管理。 我还需要在其中一个页面中获取用户输入并保存它,因此我使用MDTextField获取文本,并使用按钮保存数据。 当我按下按钮时,应用程序应该从文本字段中获取数据并将其保存在带有sqlite3的文件中,但当我按下按钮时,它会给我一个非常奇怪的错误。 我试着在没有ScreenManager的情况下只重写应用程序的那一页,结果成功了。 我怎样才能使它与屏幕管理器一起工作

如何使用MDTextField和ScreenManager获取用户输入

我将向您展示一些代码行,以便您更好地理解:

这是Kivy代码:

<AddWindow>:
    name: "add"
        
MDTextField:
    id: account_link
    hint_text: "Link"
    helper_text: "Insert the Link of the WebSite to enter in the website from this app"
    helper_text_mode: "on_focus"
    line_color_normal: app.theme_cls.accent_color
    pos_hint: {"center_x": 0.5, "center_y": 0.8}
    size_hint_x: None
    width: 1200

这是从文本字段获取数据的代码(用户按下提交按钮时执行的代码部分):

data = self.root.ids["account_link"].text

这是我按下按钮时出现的错误:

data = self.root.ids["account_link"].text
KeyError: 'account_link'

Tags: the代码text用户文本应用程序屏幕错误
2条回答

注意documentation表示:

ids are added to the root widget’s ids dictionary.

糟糕的文档,因为它们在别处将“根部件”称为整个GUI的根。但在本例中,“根小部件”是定义ids的规则的根。在您的例子中,这可能是AddWindow规则(由于kv代码段的缩进,不能100%确定)。如果是这种情况,则需要对GUI中出现的AddWindow实例的引用:

data = addwindow_instance.ids["account_link"].text

在没有看到更多代码的情况下,我只能猜测访问AddWindow实例的适当方法

随着一个完整的代码添加,我现在可以帮助你。以下是add_passwd()方法的修改版本:

def add_passwd(self):

    # get a reference to the AddWindow Screen
    addwindow_instance = self.root.get_screen('add')

    # use that instance to access the MDTextFields
    account_link = addwindow_instance.ids["account_link"].text
    account_name = addwindow_instance.ids["md_account_name"].text
    account_nickname = addwindow_instance.ids["md_account_nickname"].text
    email = addwindow_instance.ids["md_email"].text
    passwd = addwindow_instance.ids["md_passwd"].text

    #TEST
    print(account_link)
    print(account_name)
    print(account_nickname)
    print(email)
    print(passwd)

请注意,这还需要对kv进行一些更正。无论您在哪里,都可以看到:

id: "some_id"

应改为:

id: some_id

一个例子是id: "md_account_name"

这是我的更多代码:

# Screens
class MainWindow(Screen):
    pass
class AddWindow(Screen):
    pass
class WindowManager(ScreenManager):
    pass

KV = """
WindowManager:
MainWindow:
AddWindow:

<MainWindow>:
    name: "main"

MDRoundFlatButton:
    text: "Add"
    pos_hint: {"center_x": 0.5, "center_y": 0.7}
    on_press: 
        app.root.current = "add"
        root.manager.transition.direction = "left"
    
MDRoundFlatButton:
    text: "Show"
    pos_hint: {"center_x": 0.5, "center_y": 0.6}
    on_press: 
        app.root.current = "show"
    
MDTextButton:
    text: "Account"
    pos_hint: {"center_x": 0.5, "center_y": 0.1}
    on_press: 
        app.root.current = "settings"
        root.manager.transition.direction = "up"

<AddWindow>:
    name: "add"
    MDRaisedButton:
    text: "BACK"
    md_bg_color: 0, 0, 0, 1
    pos_hint: {"x": 0.01, "y": 0.93}
    on_release: 
        app.root.current = "main"
         root.manager.transition.direction = "right"
            
MDTextField:
    id: account_link
    hint_text: "Link"
    helper_text: "Insert the Link of the WebSite to enter in the website from 
    this app"
    helper_text_mode: "on_focus"
    line_color_normal: app.theme_cls.accent_color
    pos_hint: {"center_x": 0.5, "center_y": 0.8}
    size_hint_x: None
    width: 1200

MDTextField:
    id: "md_account_name"
    hint_text: "Account"
    helper_text: "Insert the Name of the Account You Want to Save"
    helper_text_mode: "on_focus"
    line_color_normal: app.theme_cls.accent_color
    pos_hint: {"center_x": 0.5, "center_y": 0.7}
    size_hint_x: None
    width: 1200
    
MDTextField:
    id: "md_account_nickname"
    hint_text: "Nickname"
    helper_text: "Insert the Nickname You Have in the Account"
    helper_text_mode: "on_focus"
    line_color_normal: app.theme_cls.accent_color
    pos_hint: {"center_x": 0.5, "center_y": 0.6}
    size_hint_x: None
    width: 1200
    
MDTextField:
    id: "md_email"
    hint_text: "Email"
    helper_text: "Insert the Email You Created the Account with"
    helper_text_mode: "on_focus"
    line_color_normal: app.theme_cls.accent_color
    pos_hint: {"center_x": 0.5, "center_y": 0.5}
    size_hint_x: None
    width: 1200
    
MDTextField:
    id: "md_passwd"
    hint_text: "Password"
    helper_text: "Insert Your Password of the Account"
    helper_text_mode: "on_focus"
    line_color_normal: app.theme_cls.accent_color
    pos_hint: {"center_x": 0.5, "center_y": 0.4}
    size_hint_x: None
    width: 1200
    
MDFillRoundFlatButton:
    text: "Submit"
    pos_hint: {"center_x": 0.5, "center_y": 0.1}
    on_press: app.add_passwd()
"""

class App(MDApp):

def build(self):
    self.title = "Safed" #The Name of the App is "Safed": "Save" + "Saved"
    self.theme_cls.theme_style = "Dark" # Light
    self.theme_cls.primary_palette = "Blue"
    return Builder.load_string(KV)

def add_passwd(self):
    account_link = AddWindow_istance.ids["account_link"].text
    account_name = self.root.ids["md_account_name"].text
    account_nickname = self.root.ids["md_account_nickname"].text
    email = self.root.ids["md_email"].text
    passwd = self.root.ids["md_passwd"].text

    #TEST
    print(account_link)
    print(account_name)
    print(account_nickname)
    print(email)
    print(passwd)


if __name__ == "__main__":
    App().run()

相关问题 更多 >