简体   繁体   English

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

[英]Kivy can't get text input using ScreenManager

I'me working on a project and I'm using kivy.我正在做一个项目,我正在使用 kivy。

I want to crete an app and I need multiple pages so I'm using ScreenManages .我想创建一个应用程序,我需要多个页面,所以我正在使用ScreenManages I also need to take User Input in one of the pages and save it, so I've used MDTextField for take the text and a button to save the data.我还需要在其中一个页面中获取用户输入并保存它,所以我使用了MDTextField来获取文本和一个按钮来保存数据。 When i press the button the app should take the data from the text field and save it in a file with sqlite3, but when I press the button it give me a really strange error.当我按下按钮时,应用程序应该从文本字段中获取数据并将其保存在一个带有 sqlite3 的文件中,但是当我按下按钮时,它给了我一个非常奇怪的错误。 I've tried to rewrite only that page of the app without the ScreenManager and it works.我试图在没有 ScreenManager 的情况下只重写应用程序的那个页面并且它可以工作。 How can I make it work also with the ScreenManager ?我怎样才能让它与 ScreenManager 一起工作?

( How can I get the User Input using MDTextField and ScreenManager ) 如何使用 MDTextField 和 ScreenManager 获取用户输入

I will show you some lines of code to make you understand better:我将向您展示一些代码行,以便您更好地理解:

This is the Kivy Code:这是 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

This is the code to take the data from the Text Field (that part of code it's executed when the user presses the submit button):这是从文本字段中获取数据的代码(当用户按下提交按钮时执行的那部分代码):

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

This is the error i get when i press the button:这是我按下按钮时得到的错误:

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

Note that the documentation says:请注意,文档说:

ids are added to the root widget's ids dictionary. ids 被添加到根小部件的 ids 字典中。

Poorly worded documentation, because they elsewhere refer to "root widget" as the root of the entire GUI.措辞不佳的文档,因为他们在其他地方将“根小部件”称为整个 GUI 的根。 But in this case "root widget" is the root of the rule where the ids are defined.但在这种情况下,“根小部件”是定义ids的规则的根。 In your case that might be the AddWindow rule (not 100% sure due to the indentation of your kv snippet).在您的情况下,这可能是AddWindow规则(由于kv片段的缩进,不能 100% 确定)。 If that is the case, then you need a reference to the instance of AddWindow that appears in your GUI:如果是这种情况,那么您需要引用出现在 GUI 中的AddWindow实例:

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

Without seeing more of your code, I can only guess at the appropriate method to access the instance of AddWindow .在没有看到更多代码的情况下,我只能猜测访问AddWindow实例的适当方法。

With the addition of a complete code, I can now help you.通过添加完整的代码,我现在可以为您提供帮助。 Here is a modified version of your add_passwd() method:这是您的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)

Note that this also requires a couple corrections to your kv .请注意,这还需要对您的kv进行一些更正。 Wherever you have anything like:无论你在哪里有这样的东西:

id: "some_id"

it should be changed to:应改为:

id: some_id

One example is id: "md_account_name" .一个例子是id: "md_account_name"

This is More of my code:这是我的更多代码:

# 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()

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM