Ich bin neu zu Kivy, aber habe ein Inventar-Programm mit Tkinter erstellt.Python-Kivy: Ändern Sie Bildschirme mit Python-Methode (verschachtelte Screen-Manager in Kivy-Code erstellt)
Ich mache ein Inventory-Programm mit Kivy und plane zunächst einen Anmeldebildschirm mit einem TextInput-Feld für den Benutzernamen (nur), und mit dem on_text_verify möchte ich schließlich eine Methode ausführen, die den Benutzernamen gegen eine prüft Datenbank, aber jetzt versuche ich nur, es eine Methode (in Python-Code) zu starten, die den Bildschirm zu einem ändert, der einen verschachtelten ScreenManager enthält.
Ich weiß, wie man KV-Code verwendet, um es Bildschirme zu ändern, aber da ich den Benutzernamen gegen eine Datenbank überprüfen muss, muss ich stattdessen eine Python-Methode ausführen, die dies tut und dann, wenn der Benutzername akzeptiert wird , dann ändern Sie den Bildschirm. Hier ist, was ich bisher:
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.label import Label
from kivy.uix.button import Button
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.screenmanager import Screen, ScreenManager
from kivy.properties import ObjectProperty
from kivy.uix.popup import Popup
## I have imported all of these as I have been trying out different things ##
class LoginScreen(Screen):
pass
class MainScreen(Screen):
pass
class ScanScreen(Screen):
pass
class InventoryScreen(Screen):
pass
class ItemsScreen(Screen):
pass
class LogsScreen(Screen):
pass
class AlertsScreen(Screen):
pass
class HelpScreen(Screen):
pass
class MainWindow(FloatLayout):
def __init__(self, **kwargs):
super(MainWindow, self).__init__(**kwargs)
def goto_Mainscr(self):
self.current="Mainscr"
class Invtest3App(App):
def build(self):
return MainWindow()
if __name__ == '__main__':
Invtest3App().run()
Hier ist der KV-Code:
<MainWindow>:
orientation: 'vertical'
name: "mainw"
id: mw
ScreenManager:
id: loginsm
LoginScreen:
MainScreen:
<ScanScreen>:
name: "Scan"
Button:
text: "Scan In"
pos_hint: {"x": 0, 'y': 0}
size_hint: 1.0/5.0, 0.1
Button:
text: "Scan Out"
pos_hint: {"x": 1.0/5.0, 'y': 0}
size_hint: 1.0/5.0, 0.1
Button:
text: "Event"
pos_hint: {"x": 2.0/5.0, 'y': 0}
size_hint: 1.0/5.0, 0.1
Button:
text: "Recount"
pos_hint: {"x": 3.0/5.0, 'y': 0}
size_hint: 1.0/5.0, 0.1
Button:
text: "Logout"
pos_hint: {"x": 4.0/5.0, 'y': 0}
size_hint: 1.0/5.0, 0.1
on_press: app.root.ids.loginsm.current = 'Loginscr'
<InventoryScreen>:
name: "Inventory"
Label:
text: "Inventory Screen"
<ItemsScreen>:
name: "Items"
Label:
text: "Items Screen"
<LogsScreen>:
name: "Logs"
Label:
text: "Logs Screen"
<AlertsScreen>:
name: "Alerts"
Label:
text: "Alerts Screen"
<HelpScreen>:
name: "Help"
Label:
text: "Help Screen"
<LoginScreen>:
name: "Loginscr"
id: loginscr
Label:
name: "loginlabel"
text: "Scan ID Barcode or Enter V# and Press Enter"
pos_hint: {"center_x": .5, "center_y": .5}
TextInput:
hint_text: "Scan ID Barcode or Enter V# and Press Enter"
id: login_input
size_hint: 0.2, 0.1
pos_hint: {"center_x": .5, "center_y": 0.2}
multiline: False
focus: True
on_text_validate: app.root.goto_Mainscr; self.text=""
#app.root.goto_Mainscr
#app.root.ids.loginsm.current = "Mainscr"
<MainScreen>:
name: "Mainscr"
FloatLayout:
pos_hint: {'top': 1}
size_hint: 1, 0.1
Button:
name: "scanButton"
text: "Scan"
pos_hint: {'x': 0, 'y': 0}
size_hint: 1.0/6.0, 1
on_press: root.ids.sm.current = "Scan"
Button:
name: "inventoryButton"
text: "Inventory"
pos_hint: {'x': 1.0/6.0, 'y': 0}
size_hint: 1.0/6.0, 1
on_press: root.ids.sm.current = "Inventory"
Button:
name: "itemsButton"
text: "Items"
pos_hint: {'x': 2.0/6.0, 'y': 0}
size_hint: 1.0/6.0, 1
on_press: root.ids.sm.current = "Items"
Button:
name: "logsButton"
text: "Logs"
pos_hint: {'x': 3.0/6.0, 'y': 0}
size_hint: 1.0/6.0, 1
on_press: root.ids.sm.current = "Logs"
Button:
name: "alertsButton"
text: "Alerts"
pos_hint: {'x': 4.0/6.0, 'y': 0}
size_hint: 1.0/6.0, 1
on_press: root.ids.sm.current = "Alerts"
Button:
name: "helpButton"
text: "Help"
pos_hint: {'x': 5.0/6.0, 'y': 0}
size_hint: 1.0/6.0, 1
on_press: root.ids.sm.current = "Help"
FloatLayout:
ScreenManager:
id: sm
pos_hint: {'top': 0.9}
size_hint: 1, 0.9
ScanScreen:
InventoryScreen:
ItemsScreen:
LogsScreen:
AlertsScreen:
HelpScreen:
Ich verstehe Ihre Frage, weshalb dies keine Antwort ist. Ich möchte nur darauf hinweisen, dass Sie tun können, was Sie innerhalb der .kv tun wollen, und trotzdem unverfälschte Python-Funktionen aufrufen. – Afflicted
Ich vermute, das Problem ist mit dem Aufruf einer Python-Funktion von kv. Jedes Mal, wenn ich eine Funktion aufrufen, die Bildschirme ändert, passiert nichts. Zukünftig wird die gleiche Funktion zuerst den Benutzernamen gegen eine MySQL-Datenbank prüfen, und wenn validiert, dann wechseln Sie die Bildschirme, aber FIRST muss ich es zumindest bekommen, um Bildschirme zu wechseln, oder ALLES ALLES. Vielen Dank! – Mrhankycowdog
So können Sie Bildschirme mit geraden Python während der Verwendung von. Kv wechseln, aber es ist schmutzig. Die Art und Weise, wie Sie es jetzt eingerichtet haben, ist der beste Weg, dies während der Verwendung von .kv zu tun. Wenn Ihr langfristiges Ziel darin besteht, den Benutzernamen zu erhalten und zu verifizieren, wechseln Sie dann Ihren Bildschirm. Was Sie tun könnten, ist einfach eine Bool-Variable innerhalb der .kv zu werfen und als falsch zu setzen und wenn der Benutzer den Benutzernamen eingibt, vorausgesetzt, dass er korrekt ist, können Sie das Flag auf true setzen und den Bildschirm wechseln. Wie? Tun Sie es bei Ihrem Anruf, um den Text zu verifizieren. Zum Beispiel in der on_text_validate(). Ansonsten, wenn Sie die .kv-Sprache löschen möchten, sehen Sie die Antwort von @Qback – Afflicted