Как отобразить переменное изображение с файлом KV? - PullRequest
0 голосов
/ 05 апреля 2020

Я пытаюсь сделать карточную игру с Python и Киви и не могу заставить карту отображаться. Пока что ChaseTheAce.deal выбирает случайную карту и удаляет ее из колоды. Я не могу понять, как передать строку из карточки dict в изображение в файле KV. Я новичок в Kivy и у меня проблемы с идентификаторами и информацией, которая совпадает с информацией из файла PY. Спасибо за любую помощь, спасибо!

Файл PY

import kivy
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.uix.image import Image
from kivy.uix.widget import Widget
from kivy.properties import StringProperty
import random
import numpy as np

cards = ['ace_spades', 'king_spades']
dict = {'ace_spades':'ace_of_spades.png', 'king_spades':'king_of_spades2.png'}

class LoginScreen(Screen):
    pass

class GameScreen(Screen):
    pass

class ScoreScreen(Screen):
    pass

class WindowManager(ScreenManager):
    pass

class ChaseTheAce(App):
    cardimagefile = StringProperty()
    def deal(self):
        mycard = random.choice(cards)
        cards.remove(mycard)
        cardimagefile = (dict[mycard])
    def build(self):
        return kv

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

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

Файл KV

<GameScreen>:
    ChaseTheAce:ChaseTheAce
    name: "GameScreen"
    GridLayout:

        rows: 3
        Image:
            id: cardimage
            source: ChaseTheAce.cardimagefile #<<<<<<<<<<<<<<<<<<<
            allow_stretch: True
        GridLayout:
            dealer:deal
            cols: 3

            Button:
                id: deal
                text: "Deal"
                on_release:
                    app.deal()

Отредактирован для удаления несвязанных частей кода.

1 Ответ

0 голосов
/ 05 апреля 2020

В вашем примере есть несколько ошибок:

  • Вам нужен макет root, который содержит все содержимое вашего приложения.
  • Вам нужен ScreenManager для управляйте своим Screens (который вы должны поместить в него).
  • Чтобы получить доступ к свойству cardimagefile в файле .py, вы должны использовать self.cardimagefile, в противном случае вы просто создаете новый, другая, локальная cardimagefile переменная.
  • Чтобы получить доступ к свойству cardimagefile в файле .kv, вы должны использовать app.cardimagefile

, поскольку у меня нет ваши изображения, я добавил print всякий раз, когда source из Image меняется, и он отлично работает ..

код py:

cards = ['ace_spades', 'king_spades']
dict = {'ace_spades':'ace_of_spades.png', 'king_spades':'king_of_spades2.png'}

Builder.load_file("cta1.kv")

class LoginScreen(Screen):
    pass

class GameScreen(Screen):
    pass

class ScoreScreen(Screen):
    pass

class WindowManager(ScreenManager):
    pass

class RootLayout(FloatLayout):  # create a root layout
    pass

class ChaseTheAce(App):
    cardimagefile = StringProperty()
    def deal(self):
        mycard = random.choice(cards)
        cards.remove(mycard)
        self.cardimagefile = (dict[mycard])  # the cardimagefile is not local needs self.
    def build(self):
        return RootLayout()  # you must return the root layout here

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

код kv :

<RootLayout>:        # you need a root layout
    WindowManager:   # that contains a ScreenManager
        GameScreen:  # that manages the screens
            # ChaseTheAce:ChaseTheAce  # you don't need this
            name: "GameScreen"
            GridLayout:
                rows: 3
                Image:
                    id: cardimage
                    source: app.cardimagefile #<<<<<<<<<<<<<<<<<<<
                    allow_stretch: True
                    on_source: print(self.source)
                GridLayout:
                    # dealer:deal  # you don't need this
                    cols: 3

                    Button:
                        id: deal
                        text: "Deal"
                        on_release:
                            app.deal()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...