【问题标题】:Python-Kivy: Change screens using Python method (nested Screen managers created in Kivy code)Python-Kivy:使用 Python 方法更改屏幕(在 Kivy 代码中创建的嵌套屏幕管理器)
【发布时间】: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


【解决方案1】:

如果你想在不使用 kv 的情况下管理屏幕,那么它看起来像这样:

  1. 导入需要的类:

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

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

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

    second_screen=Screen(name="main_screen")
    

现在您可以像这样更改屏幕:

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

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

【讨论】:

  • 谢谢,但我已经知道了。如果可能的话,我更喜欢使用 Python 和 KV。我主要想将 Python 代码用于功能/逻辑,并使用 KV 来显示所有内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-29
  • 1970-01-01
相关资源
最近更新 更多