【问题标题】:How can I make a TextInput recognize a dictionary on kivy?如何让 TextInput 识别 kivy 上的字典?
【发布时间】:2015-08-10 08:19:23
【问题描述】:

我的应用需要识别第一个屏幕中的用户才能转到第二个屏幕。如何制作一个仅在文本输入在字典中时才有效的按钮? 这个按钮应该在屏幕上:'User'

这是我的代码:

from kivy.app import App
from kivy.base import runTouchApp
from kivy.lang import Builder
from kivy.properties import ListProperty
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.screenmanager import ScreenManager, Screen, FadeTransition
import time
import random


'''
A DICTIONARY AS AN EXAMPLE
'''
dic = {}
dic['a'] = 2


class Mapa(Screen):
    pass

class Calendario(Screen):
    pass

class Professores(Screen):
    pass

class Sair(Screen):
    pass

class Usuario(Screen):
    pass

class MyScreenManager(ScreenManager):
    pass


root_widget = Builder.load_string('''

#:import FadeTransition kivy.uix.screenmanager.FadeTransition

MyScreenManager:

    transition: FadeTransition()
    User:
    Calendario:
    Mapa:
    Professores:
    Sair:

<User>:
    a: _a
    name: 'User'
    FloatLayout:
        Label:
            text: 'User'
            font_size: 50
            size_hint_y: 1.7
            size_hint_x: .95
        GridLayout:
            size_hint_y: 0.08
            size_hint_x: .6
            height: 80
            pos_hint: {'center_x': .5, 'center_y':.6}
            cols: 2
            Label:
                text: "Login"
                font_size: 30
            TextInput:
                id: _a
                font_size: 30
                multline: False
        Button:
            text: 'go'
            font_size: 30
            size_hint_y: .1
            size_hint_x: .1
            pos_hint: {'center_x': .5, 'center_y':.4}
            on_release: app.root.current = 'Calendario'
            #if _a in dic:
                #on_release: app.root.current = 'Calendario'




<Calendario>:
    name: 'Calendario'

    BoxLayout:
        orientation: 'vertical'
        Label:
            text: 'Calendario'
            font_size: 30
            size_hint: [1,.2]

        BoxLayout:

        BoxLayout:
            Button:
                text: 'Mapa'
                font_size: 20
                size_hint: [1,.2]
                on_release: app.root.current = 'Mapa'
            Button:
                text: 'Calendario'
                font_size: 20
                size_hint: [1,.2]
                on_release: app.root.current = 'Calendario'

            Button:
                text: 'Professores'
                font_size: 20
                size_hint: [1,.2]
                on_release: app.root.current = 'Professores'

            Button:
                text: 'Sair'
                font_size: 20
                size_hint: [1,.2]
                on_release: app.root.current = 'Usuario'

<Mapa>:
    name: 'Mapa'

    BoxLayout:
        orientation: 'vertical'
        Label:
            text: 'Mapa'
            font_size: 30
            size_hint: [1,.2]

        BoxLayout:

        BoxLayout:
            Button:
                text: 'Mapa'
                font_size: 20
                size_hint: [1,.2]
                on_release: app.root.current = 'Mapa'
            Button:
                text: 'Calendario'
                font_size: 20
                size_hint: [1,.2]
                on_release: app.root.current = 'Calendario'

            Button:
                text: 'Professores'
                font_size: 20
                size_hint: [1,.2]
                on_release: app.root.current = 'Professores'

            Button:
                text: 'Sair'
                font_size: 20
                size_hint: [1,.2]
                on_release: app.root.current = 'Usuario'

<Professores>:
    name: 'Professores'

    BoxLayout:
        orientation: 'vertical'
        Label:
            text: 'Professores'
            font_size: 30
            size_hint: [1,.2]

        BoxLayout:

        BoxLayout:
            Button:
                text: 'Mapa'
                font_size: 20
                size_hint: [1,.2]
                on_release: app.root.current = 'Mapa'
            Button:
                text: 'Calendario'
                font_size: 20
                size_hint: [1,.2]
                on_release: app.root.current = 'Calendario'

            Button:
                text: 'Professores'
                font_size: 20
                size_hint: [1,.2]
                on_release: app.root.current = 'Professores'

            Button:
                text: 'Sair'
                font_size: 20
                size_hint: [1,.2]
                on_release: app.root.current = 'Usuario'

<Sair>:
    name: 'Sair'

    BoxLayout:
        orientation: 'vertical'
        Label:
            text: 'Sair'
            font_size: 30
            size_hint: [1,.2]

        BoxLayout:

        BoxLayout:
            Button:
                text: 'Mapa'
                font_size: 20
                size_hint: [1,.2]
                on_release: app.root.current = 'Mapa'
            Button:
                text: 'Calendario'
                font_size: 20
                size_hint: [1,.2]
                on_release: app.root.current = 'Calendario'

            Button:
                text: 'Professores'
                font_size: 20
                size_hint: [1,.2]
                on_release: app.root.current = 'Professores'

            Button:
                text: 'Sair'
                font_size: 20
                size_hint: [1,.2]
                on_release: app.root.current = 'Usuario'

''')

class ScreenManagerApp(App):
    def build(self):
        return root_widget
ScreenManagerApp().run()

【问题讨论】:

    标签: python-2.7 python-3.x dictionary kivy


    【解决方案1】:

    用途:

    #: import dic main.dic
    

    其中 main 是 .py 文件的名称

    那么在你的 kv 文件的正文中你应该能够做到:

    on_release: if dic['a']==2: app.root.current = 'Calendario'
    

    【讨论】:

      【解决方案2】:

      是的,就像MuchCheeseIsTooMuchCheese 回答的那样,有一种(而且丑陋的)方法可以做到这一点。丑陋是因为你定义你的 dict(作为一个全局)的方式,所以没有很好的方法来玩它。

      另一边的 Kivy 有一个主类 - App,如果您不直接使用 runTouchApp(),那么它会在每个应用程序中使用,所以最好的方法是获得它

      dic = {}
      dic['a'] = 2
      

      从您的全局空间并将其放在它所属的位置,或者使用更好的全局方式,即get_running_app,并将这些行放在__init__ 中的App 类中或作为类变量。

      然后使用 kv 中的app.&lt;variable&gt; 访问它的最简单方法 + 如果您将它们与 get_running_app() 连接在一起并让 App 类处理通信,您可以与其他类很好地玩耍。

      【讨论】:

        猜你喜欢
        • 2013-09-10
        • 1970-01-01
        • 1970-01-01
        • 2017-05-04
        • 2014-03-29
        • 1970-01-01
        • 2021-04-27
        • 2021-07-16
        • 2021-11-03
        相关资源
        最近更新 更多