Kivy - Создать GridLayout для l oop на нескольких экранах (в .py файле) и как передавать данные между экранами? - PullRequest
0 голосов
/ 25 марта 2020

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

  • Первый вопрос: на каждом экране я хочу использовать GridLayout, а затем создавать ярлыки и кнопки для каждого игрока, используя для l oop, так как для каждого игрока должны быть созданы один и тот же ярлык и кнопка. (В отличие от того, что я делал до сих пор в файле .kv), я бы предпочел создать это для l oop внутри файла .py, а не файла .kv, так как у меня больше опыта в языке python, но оба решения, конечно, приветствуются. Как я могу сделать это для l oop? Я пытался что-то подобное в файле .kv, но это не работает:
GridLayout:
    players: range(4)
    [for i in root.players]
        Label:
            text: 'points player {}'.format(i)
  • Второй вопрос: Как я могу передать данные, которые я получил на первом экране из TextInput (имя игрока) на второй экран и использовать его там в метке (для отображения имени игрока)? Нужно ли для этого создать переменную в файле .kv? Если да, то как это будет выглядеть на языке .kv?

  • Третий вопрос: мне все еще неясно, как связать данные между файлом .kv и файлом .py. Например, как я могу использовать данные, полученные в файле .kv, из TextInput внутри файла .py? (В моем случае, чтобы отслеживать очки, которые есть у каждого игрока, и складывать эти очки вместе на каждом следующем экране. Я предполагаю, что это должно произойти в файле .py?)

Это что мне удалось сделать до сих пор:

.py файл

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.uix.gridlayout import GridLayout
from kivy.uix.button import Button


class WelcomeWindow(Screen):
    # Introduce names of the 4 players
    pass


class FirstRound(Screen):
    #Give explanation of first round + option to add points for every player
    pass


class WindowManager(ScreenManager):
    pass


kv = Builder.load_file("Kingen.kv")

class KingenApp(App):

    def build(self):
        return kv


if __name__ == "__main__":
    KingenApp().run()

.kv файл

WindowManager:
    WelcomeWindow:
    FirstRound:

<WelcomeWindow>:
    name: "welcomewindow"

    GridLayout:
        cols: 2

        Label:
            text: "Name Player 1"
        TextInput:
            id: name_p1
            multiline: False

        Label:
            text: "Name Player 2"
        TextInput:
            id: name_p2
            multiline: False

        Label:
            text: "Name Player 3"
        TextInput:
            id: name_p3
            multiline: False

        Label:
            text: "Name Player 4"
        TextInput:
            id: name_p4
            multiline: False

        Button:
            text: "Go to first round"
            on_release:
                app.root.current = "firstround"
                root.manager.transition.direction = "left"

<FirstRound>:
    name: "firstround"

    GridLayout:
        id: 'gridlayout_firstround'
        cols: 4

        Button:
            text: "Go back"
            on_release:
                app.root.current = "welcomewindow"
                root.manager.transition.direction = "right"

        Button:
            text: "Go to second round"
            on_release:

Помощь по любому из этих вопросов очень ценится, спасибо!

...