I have the first page with login and perform checking on the .py file with database (sqlite3). Now the problem is how do I go to another page after perform the checking. Here I use the sm.windowManager but it does not work and give me a blank page. Is there anything can help me to go to other page on the .py file instead on the .kv file on_press
Here is the code:
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'
Advertisement
Answer
The lines:
sm = windowManager() sm.add_widget(MainWindow(name='Main')) sm.add_widget(ReserveWindow(name='Reserve'))
build your widget tree. However the lines in your kv
file:
windowManager: MainWindow: ReserveWindow:
also build a widget tree (but without the required name
properties for each Screen
).
I recommend changing you kv
to include the names
:
windowManager: MainWindow: name: "Main" ReserveWindow: name: "Reserve"
And using that to build your widget tree in your 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.")
Note that naming your kv
file as my.kv
would allow it to be loaded automatically and you could eliminate the build()
method entrely (see documentation). But that would required a change in your check()
method.