如何在回调时在 Kivy 布局之间切换?

Posted

技术标签:

【中文标题】如何在回调时在 Kivy 布局之间切换?【英文标题】:How To Switch Between Kivy Layouts On Calllback? 【发布时间】:2019-08-27 22:22:00 【问题描述】:

我是 Kivy 和 Python 的初学者,我正在尝试创建一个简单的字母应用程序来练习。它应该看起来像这样。

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

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

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

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 的知识。非常感谢。

【问题讨论】:

你可以只更改图像源文件 【参考方案1】:

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

或者.. 只需使用不同的 imgs A-Z 并循环浏览它们(如@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 是全球性的。剩下的就是将变量绑定到标签上。

【讨论】:

以上是关于如何在回调时在 Kivy 布局之间切换?的主要内容,如果未能解决你的问题,请参考以下文章

如何在kivy python中的两个屏幕之间切换?

如何在按钮单击时在“ui-body-a”和“ui-body-b”之间切换[重复]

在 Kivy 上双击时如何回调和打印 MDLabel 的文本?

Android - 录制视频时在前后摄像头之间切换

kivy如何切换屏幕?

如何将纯 python 中动态创建的按钮添加到用 Kivy 语言编写的 kivy 布局中?