Как переключаться между макетами Kivy на Calllback? - PullRequest
0 голосов
/ 06 апреля 2019

Я новичок в Kivy и Python и пытаюсь создать простое алфавитное приложение для практики. Это должно выглядеть примерно так. Simple alphabet app that should transfer between layouts when the next/prev button is pushed

Я хочу создать простое алфавитное приложение, которое должно переключаться между макетами, когда нажимается следующая / предыдущая кнопка.

То, что я пытался сделать, это поместить изображения в отдельные плавающие макеты в соответствии с буквой алфавита, чтобы избежать необходимости использовать менеджер экрана и создавать / связывать 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 и заставить его переключать макеты с помощью кнопок «следующий / предыдущий»?

Я знаю, что чего-то не хватает в моих функциях и файле kv, но я не могу найти это. Я надеюсь, что вы можете мне помочь. Я действительно хочу узнать больше о Python и Kivy. Большое спасибо.

1 Ответ

0 голосов
/ 07 апреля 2019

Если бы это была метка, вы могли бы потенциально создать функцию, которая содержит и зацикливает алфавит, а затем подает его на вход для метки.

Или ... просто используйте разные 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 глобален.Остальная часть будет просто привязывать переменную к метке.

...