【发布时间】:2017-05-23 22:45:20
【问题描述】:
我是 Kivy 的新手,但使用 Tkinter 创建了一个库存程序。
我正在使用 Kivy 制作一个库存程序,并计划首先使用用户名的 TextInput 框(仅)创建一个登录屏幕,然后使用 on_text_verify 我希望它最终运行一个方法来检查用户名与数据库,但现在我只是想让它运行一种方法(在 Python 代码中),将屏幕更改为包含嵌套 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代码:
<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:
【问题讨论】:
-
我理解你的问题,这就是为什么这不是一个答案。我只想指出,您可以在 .kv 中执行您尝试执行的操作,并且仍然可以直接调用 python 函数。
-
我想问题在于从 kv 调用 python 函数。每次我调用一个改变屏幕的函数时,什么都没有发生。将来,同样的功能将首先根据 mysql 数据库检查用户名,如果经过验证,则切换屏幕,但首先我需要至少让它切换屏幕,或者任何东西。谢谢!
-
因此您可以在使用 .kv 时使用直接 python 切换屏幕,但它很脏。您现在设置它的方式是最好的方式,在使用 .kv 时执行此操作 如果您的长期目标是获取用户名并验证它,然后切换您的屏幕。您可以做的只是在 .kv 中抛出一个 bool 变量,将其设置为 false,当用户输入用户名并假设它是正确的时,您可以将标志切换为 true 并更改屏幕。如何?在您的通话中执行此操作以验证文本。例如在 on_text_validate() 中。否则,如果您想放弃 .kv 语言,请参阅@Qback 的答案
标签: python-3.x kivy kivy-language