2017-05-23 2 views
0

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: 
+0

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

+0

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

+0

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

Antwort

1

Wenn Sie Bildschirme verwalten möchten, ohne kv dann sieht es wie folgt aus:

  1. Importieren benötigte Klassen:

    from kivy.uix.screenmanager import ScreenManager, Screen 
    
  2. Erstellen Sie einen Bildschirm-Manager Variable:

    scene=ScreenManager() 
    
  3. einen Bildschirm erstellen:

    screen=Screen(name="login_screen") 
    
  4. erstellen zweite Bildschirm:

    second_screen=Screen(name="main_screen") 
    

Jetzt können Sie Bildschirme wie folgt ändern:

scene.current="login_screen" 
scene.current="main_screen" 

Und Sie können Widgets zu diesen Bildschirmen hinzufügen.

+0

Danke, aber das weiß ich schon. Ich würde es vorziehen, wenn möglich Python UND KV zu verwenden. Ich möchte hauptsächlich Python-Code für die Funktionen/Logik und KV für die Darstellung von allem verwenden. – Mrhankycowdog

Verwandte Themen