如何在 kivymd 中转到第二页 python

How to go to second page in kivymd python

我有登录的第一页,并使用数据库 (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()

Myapp.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'

行数:

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

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

windowManager:
    MainWindow:
    ReserveWindow:

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

我建议您更改 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() 方法(请参阅 documentation)。但这需要更改您的 check() 方法。