首页 > 解决方案 > 如何在 Calllback 上切换 Kivy 布局?

问题描述

我是 Kivy 和 Python 的初学者,我正在尝试创建一个简单的字母应用程序来练习。它应该看起来像这样。按下下一个/上一个按钮时应在布局之间传输的简单字母应用程序

我想创建一个简单的字母应用程序,当按下下一个/上一个按钮时应该在布局之间切换。

我试图做的是将图像放在每个字母的单独浮动布局中,以避免必须使用屏幕管理器和创建/链接 26 个屏幕。我试图通过切换 FloatLayouts 来切换图像。

我之前在这里问过这个问题,到目前为止,这就是我所得到的。

import kivy
from kivy.uix.label import Label
from kivy.uix.button import Button
from kivy.uix.boxlayout import BoxLayout
from kivy.lang import Builder
from kivy.uix.image import Image
from kivy.app import App
from kivy.uix.screenmanager import ScreenManager, Screen


class LearnAlphabetScreen(Screen):
    alphabet = 'abcdefghijklmnopqrstuvwxyz'

    def next_letter(self):
        # Get a reference to the widget that shows the letters
        # self.root refers to the root widget of the kv file -- in this case,
        # the GridLayout
        current_letter_widget = self.root.ids['a']
        # Get the letter currently shown
        current_letter = current_letter_widget.text
        # Find the next letter in the alphabet
        next_letter_index = self.alphabet.find(current_letter) + 1
        next_letter = self.alphabet[next_letter_index]

        # Set the new letter in the widget that shows the letters
        current_letter_widget.text = next_letter

    def prev_letter(self):
        current_letter_widget = self.root.ids['a']
        # Get the letter currently shown
        current_letter = current_letter_widget.text
        # Find the next letter in the alphabet
        prev_letter_index = self.alphabet.find(current_letter) - 1
        prev_letter = self.alphabet[prev_letter_index]

        # Set the new letter in the widget that shows the letters
        current_letter_widget.text = prev_letter



Builder.load_string("""

<NextButton@Button>
    font_size: 32
    color: 1, 1, 1, 1
    size: 150, 50
    backgroundcolor: .88, .88, .88, 1
    size_hint: .4, .3
    pos: -5, 440


<PrevButton@Button>
    font_size: 32
    color: 1, 1, 1, 1
    size: 150, 50
    backgroundcolor: .88, .88, .88, 1
    size_hint: .4, .3
    pos: -5, 270


<LearnAlphabetScreen>:
    canvas.before:
        Rectangle:
            pos: self.pos
            size: self.size
            source: 'bgpics/blackboard.png'

    FloatLayout:
    id:layouta
        Label:
            id:a
            text: "A"
            pos: -5, 210
            font_size: '40sp'

    FloatLayout:
    id:layoutb
        Label:
            id:b
            text: "B"
            pos: -5, 210
            font_size: '40sp'

    FloatLayout:
    id:layoutc
        Label:
            id:c
            text: "C"
            pos: -5, 210
            font_size: '40sp'

    NextButton:
        text: "Previous"
        on_release:
            screen.prev_letter()
    PrevButton:
        text: "Next"
        on_release:
            screen.next_letter()



""")



LA=LearnAlphabetScreen()  
class MainApp(App):
    def build(self):
        return LA





if __name__ == '__main__':
    MainApp().run()*

我对如何执行我的计划一无所知。字母表中的每个字母将由图片或文本标签表示,然后它们将包含在单独的 FloatLayouts 中(我需要它们位于单独的 FloatLayouts 中,以便我能够学习如何在将来通过布局切换)。如何引用 FloatLayout 的 id 并使其通过下一个/上一个按钮切换布局?

我知道我的函数和 kv 文件中缺少某些内容,但我找不到它。我希望你能帮助我我真的很想了解更多关于 Python 和 Kivy 的知识。非常感谢。

标签: androidpythonoopwidgetkivy

解决方案


如果它是一个标签,您可能会创建一个函数来保存和循环字母表,然后将其输入到标签的输入中。

或者.. 只需使用不同的 imgs AZ 并循环浏览它们(如@el3ien 所述)。

编辑:不知道这是否是您想要的,但这里有一些可以实现接近目标的功能。

from string import ascii_lowercase

Alphabet = ascii_lowercase
i = -1

def next():
    global i
    if i<27:
        i = i + 1
    print(Alphabet[i])
next()

def previous():
    global i
    if i<27:
        i = i - 1
    print(Alphabet[i])
previous()

将这些on_release:用于您的按钮。确保你的跑步i是全球性的。剩下的只是将变量绑定到标签。


推荐阅读