Kivy: 屏幕间信息传递

2024-09-30 01:30:53 发布

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

我有一个简单的应用程序,用户必须输入用户名和密码才能进入第二个屏幕。为此,我使用sqlite。
*Py

class LoginPage(Screen):
    def findAccount(self):
        username = self.ids["login_in"].text
        password = self.ids["pass_in"].text
        c.execute('''SELECT * FROM customer WHERE name = ? AND password = ?;
                  ''', (username, password))
        records = c.fetchone() #returns (1, Bob, qwerty, bob@gmail.com, 071234556)
        return records
    def verify(self):
        try:
            records = LoginPage.findAccount(self)
            if self.ids["login_in"].text == records[1] and self.ids["pass_in"].text == records[2]:
                self.manager.current = "user"
        except TypeError:
            print("Something is not correct")

class UserInfoPage(Screen):
    def show_info(self):
        pass
class ScreenManagement(ScreenManager):
    pass

kv_file = Builder.load_file("login.kv")
class LoginApp(App):
    def build(self):
        return kv_file

*千伏

ScreenManager:
    LoginPage:
    UserInfoPage:

<LoginPage>:
    orientation: "vertical"
    name: "login"
    BoxLayout:
        TextInput:
            id: login_in
        TextInput:
            id: pass_in
            password: True
        Button:
            text: "GO"
            on_release:
                root.findAccount()
                root.verify()
<UserInfoPage>:
    name: "user"
    BoxLayout:
        Label:
            id: the_id
            text: 'id: '
        Label:
            text: 'name: '
        Label:
            text: 'email: '
        Label:
            text: 'phone number: '  

通过使用“show\u info()”方法,我想在“UserInfoPage”屏幕上显示用户信息。为此,我需要来自变量'records'和'findAccount'帐户方法的信息。我试着这样做:

def show_info(self):
    information = LoginPage.findAccount(self)
    user_id = information[0]
    self.ids["the_id"].text = self.ids["the_id"].text + str(user_id)

但它抛出一个错误,因为“findAccount()”方法链接到第一个屏幕。如何保存我在第一个屏幕上得到的信息并将其传输到第二个屏幕上? 谢谢你


Tags: textnameinselfidids屏幕def
1条回答
网友
1楼 · 发布于 2024-09-30 01:30:53

首先,我们必须纠正某些错误:

  • 没有必要在.kv中调用findAccount(),因为verify().py中调用它

  • LoginPage.findAccount(self)语句不正确,必须使用self直接调用它,即正确的东西是self.findAccount()

  • 避免使用try和,除非它是不必要的,在您的情况下,只需要验证records不是None

为了添加创建新方法不需要的信息,更好的方法是创建属性,并通过屏幕分配,为了获得合适的屏幕,我们使用ScreenManagerget_screen()方法

*.py

class LoginPage(Screen):
    def findAccount(self):
        username = self.ids["login_in"].text
        password = self.ids["pass_in"].text
        c.execute('''SELECT * FROM customer WHERE name = ? AND password = ?;
                  ''', (username, password))
        records = c.fetchone() #returns (1, Bob, qwerty, bob@gmail.com, 071234556)
        return records

    def verify(self):
        records = self.findAccount()
        if records is not None:
            _id, name, password, email, phone_number = records
            if self.ids["login_in"].text == name and self.ids["pass_in"].text == password:
                user_screen = self.manager.get_screen("user")
                user_screen._id = str(_id)
                user_screen._name = name
                user_screen._email = email
                user_screen._phone_number = phone_number

                self.manager.current = "user"
            else:
                print("Something is not correct")

class UserInfoPage(Screen):
    pass

class ScreenManagement(ScreenManager):
    pass

*.kv

ScreenManager:
    LoginPage:
    UserInfoPage:

<LoginPage>:
    orientation: "vertical"
    name: "login"
    BoxLayout:
        TextInput:
            id: login_in
        TextInput:
            id: pass_in
            password: True
        Button:
            text: "GO"
            on_release:
                root.verify()

<UserInfoPage>:
    name: "user"

    _id: ""
    _name: ""
    _email: ""
    _phone_number: ""
    BoxLayout:
        Label:
            text: 'id: ' + root._id
        Label:
            text: 'name: ' + root._name
        Label:
            text: 'email: ' + root._email
        Label:
            text: 'phone number: ' + root._phone_number

相关问题 更多 >

    热门问题