0

我有登录的第一页并使用数据库(sqlite3)对 .py 文件执行检查。现在的问题是如何在执行检查后转到另一个页面。在这里我使用 sm.windowManager 但它不起作用并给我一个空白页。有什么可以帮助我转到 .py 文件而不是 .kv 文件 on_press 上的其他页面

这是代码:

from kivymd.app import MDApp
from kivy.uix.screenmanager import Screen, ScreenManager
from kivy.lang import Builder
import sqlite3

class MainWindow(Screen):
    pass

class ReserveWindow(Screen):
    pass

class windowManager(ScreenManager):
    pass


sm = windowManager()
sm.add_widget(MainWindow(name='Main'))
sm.add_widget(ReserveWindow(name='Reserve'))


class Myapp(MDApp):
    connection = None
    connection = sqlite3.connect("book.db")
    cur = None
    def build(self):
        return sm

    def check(self,ID,password):
        connection = sqlite3.connect("book.db")
        c = connection.cursor()
        c.execute("select mmu_id,password from User where mmu_id =(?) and password = (?)", (ID, password))
        exists = c.fetchall()
        if exists:
            sm.current = 'Reserve'
        else:
            print("Error: Wrong ID or password.")


Myapp().run()

我的应用程序.kv

windowManager:
MainWindow:
ReserveWindow:
<MainWindow>:
    MDScreen:
        md_bg_color : [1,1,1,1]
        MDCard :
            size_hint : None,None
            size : 320,400
            pos_hint : {"center_x":.5,"center_y":.5}
            elevation : 15
            padding: 20
            spacing : 30
            orientation : 'vertical'
            MDLabel :
                text : 'Login'
                font_style : 'Button'
                font_size : 45
                halign : 'center'
                size_hint_y : None
                height : self.texture_size[1]
            MDTextFieldRound:
                hint_text : 'MMU Id'
                id : ID
                icon_right : 'account'
                size_hint_x : None
                width : 240
                font_size: 20
                pos_hint : {"center_x":.5}
            MDTextFieldRound:
                hint_text : 'password'
                id: password
                icon_right : 'eye-off'
                size_hint_x : None
                width : 240
                font_size: 20
                pos_hint : {"center_x":.5}
            MDRoundFlatButton :
                text : 'SIGN-IN'
                pos_hint : {"center_x":.5}
                font_size : 15
                md_bg_color : [118/255,251/255,130/255,1]
                theme_text_color: 'Custom'
                text_color: [0,0,0,1]
                on_press: app.check(ID.text,password.text)
            Widget:
                size_hint_y : None
                height : 15

<ReserveWindow>:
    MDScreen:
        MDLabel :
            text : 'Page 2'
4

1 回答 1

0

这些行:

sm = windowManager()
sm.add_widget(MainWindow(name='Main'))
sm.add_widget(ReserveWindow(name='Reserve'))

构建您的小部件树。但是kv文件中的行:

windowManager:
    MainWindow:
    ReserveWindow:

还构建一个小部件树(但没有每个所需的name属性Screen)。

我建议更改您kv以包括names

windowManager:
    MainWindow:
        name: "Main"
    ReserveWindow:
        name: "Reserve"

并使用它在您的App

# sm = windowManager()
# sm.add_widget(MainWindow(name='Main'))
# sm.add_widget(ReserveWindow(name='Reserve'))


class Myapp(MDApp):
    connection = None
    connection = sqlite3.connect("book.db")
    cur = None
    def build(self):
        sm = Builder.load_file('Myapp.kv')
        return sm

    def check(self,ID,password):
        connection = sqlite3.connect("book.db")
        c = connection.cursor()
        c.execute("select mmu_id,password from User where mmu_id =(?) and password = (?)", (ID, password))
        exists = c.fetchall()
        if exists:
            self.root.current = 'Reserve'
        else:
            print("Error: Wrong ID or password.")

请注意,将kv文件命名为my.kv允许它自动加载,并且您可以完全消除该build()方法(请参阅文档)。但这需要改变你的check()方法。

于 2021-01-30T19:41:31.407 回答