Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x Python Kivy:使用Python方法更改屏幕(用Kivy代码创建的嵌套屏幕管理器)_Python 3.x_Kivy_Kivy Language - Fatal编程技术网

Python 3.x Python Kivy:使用Python方法更改屏幕(用Kivy代码创建的嵌套屏幕管理器)

Python 3.x Python Kivy:使用Python方法更改屏幕(用Kivy代码创建的嵌套屏幕管理器),python-3.x,kivy,kivy-language,Python 3.x,Kivy,Kivy Language,我是Kivy的新手,但已经使用Tkinter创建了一个库存计划 我正在使用Kivy制作一个清单程序,并计划先在登录屏幕上显示用户名的文本输入框(仅限),然后使用on_text_verify,我希望它最终运行一个方法,根据数据库检查用户名,但现在我只想让它运行一个方法(在Python代码中)这会将屏幕更改为包含嵌套屏幕管理器的屏幕 我知道如何使用KV代码使其更改屏幕,但由于我需要根据数据库检查用户名,因此我需要它运行一个Python方法来执行此操作,然后,如果用户名被接受,则更改屏幕。以下是我到目

我是Kivy的新手,但已经使用Tkinter创建了一个库存计划

我正在使用Kivy制作一个清单程序,并计划先在登录屏幕上显示用户名的文本输入框(仅限),然后使用on_text_verify,我希望它最终运行一个方法,根据数据库检查用户名,但现在我只想让它运行一个方法(在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:
:
方向:“垂直”
姓名:“缅因州”
id:mw
屏幕管理器:
id:loginsm
登录筛选:
主屏幕:
:
名称:“扫描”
按钮:
文本:“扫描入”
pos_提示:{“x”:0,“y”:0}
大小提示:1.0/5.0,0.1
按钮:
文本:“扫描出”
位置提示:{“x”:1.0/5.0,“y”:0}
大小提示:1.0/5.0,0.1
按钮:
正文:“事件”
位置提示:{“x”:2.0/5.0,“y”:0}
大小提示:1.0/5.0,0.1
按钮:
正文:“重新计票”
pos_提示:{“x”:3.0/5.0,“y”:0}
大小提示:1.0/5.0,0.1
按钮:
文本:“注销”
位置提示:{“x”:4.0/5.0,“y”:0}
大小提示:1.0/5.0,0.1
按:app.root.ids.loginsm.current='Loginscr'
:
名称:“库存”
标签:
文本:“库存屏幕”
:
名称:“项目”
标签:
文本:“项目屏幕”
:
名称:“日志”
标签:
文本:“日志屏幕”
:
名称:“警报”
标签:
文本:“警报屏幕”
:
姓名:“帮助”
标签:
文本:“帮助屏幕”
:
名称:“Loginscr”
id:loginscr
标签:
名称:“登录标签”
文本:“扫描ID条形码或输入V#并按Enter键”
pos_提示:{“center_x”:.5,“center_y”:.5}
文本输入:
提示文字:“扫描ID条形码或输入V,然后按Enter键”
id:login\u输入
大小提示:0.2,0.1
pos_提示:{“center_x”:.5,“center_y”:0.2}
多行:False
焦点:正确
on_text_validate:app.root.goto_Mainscr;self.text=“”
#app.root.goto_Mainscr
#app.root.ids.loginsm.current=“mainsr”
:
名称:“Mainscr”
浮动布局:
位置提示:{'top':1}
大小提示:1,0.1
按钮:
名称:“扫描按钮”
文本:“扫描”
位置提示:{'x':0,'y':0}
大小提示:1.0/6.0,1
按:root.ids.sm.current=“扫描”
按钮:
名称:“目录按钮”
正文:“库存”
位置提示:{'x':1.0/6.0,'y':0}
大小提示:1.0/6.0,1
按:root.ids.sm.current=“库存”
按钮:
名称:“itemsButton”
正文:“项目”
位置提示:{'x':2.0/6.0,'y':0}
大小提示:1.0/6.0,1
按:root.ids.sm.current=“Items”
按钮:
名称:“logsButton”
文本:“日志”
位置提示:{'x':3.0/6.0,'y':0}
大小提示:1.0/6.0,1
按:root.ids.sm.current=“Logs”
按钮:
名称:“警报按钮”
文本:“警报”
位置提示:{'x':4.0/6.0,'y':0}
大小提示:1.0/6.0,1
按:root.ids.sm.current=“警报”
按钮:
名称:“帮助按钮”
文本:“帮助”
位置提示:{'x':5.0/6.0,'y':0}
大小提示:1.0/6.0,1
按:root.ids.sm.current=“帮助”
浮动布局:
屏幕管理器:
id:sm
pos_提示:{'top':0.9}
尺寸提示:1,0.9
扫描屏幕:
目录屏幕:
项目筛选:
日志屏幕:
警报屏幕:
帮助屏幕:

如果您想在不使用kv的情况下管理屏幕,则如下所示:

scene.current="login_screen"
scene.current="main_screen"
  • 导入所需的类:

    from kivy.uix.screenmanager import ScreenManager, Screen
    
  • 创建屏幕管理器变量:

    scene=ScreenManager()
    
  • 创建一个屏幕:

    screen=Screen(name="login_screen")
    
  • 创建第二个屏幕:

    second_screen=Screen(name="main_screen")
    
  • 现在,您可以这样更改屏幕:

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

    您可以向这些屏幕添加小部件。

    我理解您的问题,这就是为什么这不是答案。我只想指出,您可以在.kv中执行您试图执行的操作,但仍然可以调用直接的python函数。我想问题在于从kv调用python函数。每次我调用一个改变屏幕的函数时,什么都不会发生。将来,这个相同的函数将首先根据mysql数据库检查用户名,如果经过验证,然后切换屏幕,但首先我需要至少让它切换屏幕,或者任何东西。谢谢因此,在使用.kv时,您可以使用纯python切换屏幕,但它很脏。如果您的长期目标是获取用户名并验证它,然后切换屏幕,那么现在设置它的方式是最好的方式,即在使用.kv时进行设置。您可以做的是在.kv中抛出一个bool变量,将其设置为false,当用户输入用户名时,假设它是正确的,您可以将标志切换为true并更改屏幕。怎么用?在通话中确认文本。例如,在on_text_validate()中。否则,如果您想删除.kv语言,请参阅@QbackThank的答案,但我已经知道了。如果可能的话,我更愿意使用Python和KV。我主要希望使用Python代码来实现函数/逻辑,并使用KV来显示所有内容。