2017-05-23 5 views
0

私はKivyには新しいですが、Tkinterを使用してインベントリプログラムを作成しました。Python-Kivy:Pythonメソッドを使用して画面を変更します(Kivyコードで作成されたネストされたスクリーンマネージャ)

私はKivyを使用してインベントリプログラムを作成していますが、最初にログイン画面をユーザ名(唯一)のTextInputボックスで作成し、on_text_verifyを使用して最終的にユーザ名を今のところは、ネストされたScreenManagerを含むものに画面を変更するメソッド(Pythonコードで)を実行するようにしようとしています。

KVコードを使用して画面を変更する方法はわかっていますが、データベースに対してユーザー名をチェックする必要があるため、代わりにPythonメソッドを実行してユーザー名を受け入れる必要があります画面を変更してください。ここで私はこれまで持っているものである:ここでは

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() 

はKVのコードは次のとおりです。

<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

私はあなたの質問を理解しています。これは答えではありません。私はちょうど.kvの中でやろうとしていることをやって、まっすぐなpython関数を呼び出すことができることを指摘したい。 – Afflicted

+0

問題は、kvからPython関数を呼び出すことだと思います。画面を変更する関数を呼び出すたびに何も起こりません。将来、この同じ関数はユーザ名をmysqlデータベースと照合し、検証されれば画面を切り替えますが、少なくとも画面を切り替えるためには必要です。ありがとう! – Mrhankycowdog

+0

したがって、.kvを使用している間はまっすぐなpythonで画面を切り替えることはできますが、それは汚いです。 .kvを使用しているときにこれを行うには、今設定した方法が最良の方法です。長時間の目標がユーザー名を取得して確認してから、画面を切り替えることです。あなたがすることができるのは、.kvの中にbool変数を投げることだけです。それをfalseに設定し、ユーザがユーザ名を入力したら、正しいと仮定してフラグをtrueに切り替えて画面を変更することができます。どうやって?テキストを確認するためにあなたの呼び出しでそれを行います。例えば、on_text_validate()の中で。それ以外の場合は、.kv言語を削除する場合は、@ Qback – Afflicted

答えて

1

あなたはKVを使用せずに画面を管理する場合、それは次のようになります。

  1. 必要なクラスをインポートする:

    from kivy.uix.screenmanager import ScreenManager, Screen 
    
  2. 画面マネージャの変数を作成します。画面を作成します

    scene=ScreenManager() 
    
  3. を:

    screen=Screen(name="login_screen") 
    
  4. 2番目の画面を作成します。

    second_screen=Screen(name="main_screen") 
    

今、あなたはこのような画面を変更することができます。

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

これらの画面にウィジェットを追加できます。

+0

からの回答を参照してくださいありがとう、しかし、私はこれを既に知っています。可能であれば、私はPythonとKVを使いたいと思っています。私は主に機能/ロジックのためのPythonコード、そしてすべてを表示するためのKVを使いたいと思っています。 – Mrhankycowdog

関連する問題