2017-05-23 3 views
0

저는 Kivy에 새로운 것이지만 Tkinter를 사용하여 인벤토리 프로그램을 만들었습니다.Python-Kivy : Python 메서드를 사용하여 화면 변경 (Kivy 코드에서 생성 된 중첩 된 화면 관리자)

나는 Kivy를 사용하여 인벤토리 프로그램을 만들고 사용자 이름 (단)에 대한 TextInput 상자가있는 로그인 화면을 먼저 가질 계획이며, on_text_verify를 사용하여 사용자 이름을 확인하는 메소드를 실행하고 싶습니다. 데이터베이스,하지만 지금은 중첩 된 ScreenManager를 포함하는 화면으로 변경하는 메서드를 (파이썬 코드에서) 실행하도록 시도하고 있습니다.

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 코드 : 여기에 지금까지 무엇을 당신이 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 안에서하려고하는 것을 할 수 있고 여전히 똑바로 파이썬 함수를 호출 할 수 있다는 것을 지적하고 싶다. – Afflicted

+0

문제는 kv에서 파이썬 함수를 호출하는 것입니다. 화면을 변경하는 함수를 호출 할 때마다 아무 일도 일어나지 않습니다. 앞으로이 동일한 함수는 mysql 데이터베이스에 대해 사용자 이름을 먼저 검사 할 것이고, 유효성이 확인되면 화면을 전환 할 것입니다.하지만 적어도 화면을 전환하거나 아니면 무엇이든 할 필요가 있습니다. 감사! – Mrhankycowdog

+0

.kv를 사용하는 동안 똑바로 파이썬으로 화면을 전환 할 수 있지만 더러워졌습니다. 지금 설정 한 방법은 .kv를 사용하는 동안 그것을하는 가장 좋은 방법입니다. 장기 목표가 사용자 이름을 확인하고 확인한 다음 화면을 전환하는 것입니다. 당신이 할 수있는 일은 .kv 안에 bool 변수를 던져 넣는 것입니다. false로 설정하면 사용자가 사용자 이름을 입력하면 올바른 것으로 가정하고 플래그를 true로 전환하고 화면을 변경할 수 있습니다. 방법? 전화를 걸어 텍스트를 확인하십시오. 예를 들어 on_text_validate()에 있습니다. 그렇지 않은 경우 .kv 언어를 삭제하려면 @Qback – Afflicted

답변

1

다음은 다음과 같습니다

  1. 가져 오기 필요한 클래스 :

    from kivy.uix.screenmanager import ScreenManager, Screen 
    
  2. second_screen=Screen(name="main_screen") 
    

지금이 같은 화면을 변경할 수 있습니다 :

screen=Screen(name="login_screen") 
  • 가 두 번째 화면을 만듭니다

    scene=ScreenManager() 
    
  • 가 생성 화면 :화면 관리자 변수를 만듭니다

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

    그런 화면에 위젯을 추가 할 수 있습니다.

  • +0

    의 답변을 참조하십시오. 고맙지 만, 이미 알고 있습니다. 가능한 경우 Python과 KV를 사용하는 것을 선호합니다. 필자는 주로 함수/논리에 Python 코드를 사용하고 모든 것을 표시하기 위해 KV를 사용하고자합니다. – Mrhankycowdog

    관련 문제