Python 如何使用KV文件显示可变图像?

Python 如何使用KV文件显示可变图像?,python,image,kivy,Python,Image,Kivy,我正在尝试用Python和Kivy制作一个纸牌游戏,但无法显示纸牌。到目前为止,ChaseTheAce.deal随机挑选一张牌并将其从牌组中移除。我不知道如何将字符串从卡片dict传递到KV文件中的图像。我是Kivy的新手,在ID和哪些信息与PY文件中的信息匹配方面遇到了问题。感谢您的帮助,谢谢 PY文件 KV文件 编辑以删除代码中不相关的部分。您的示例中有一些错误: 您需要一个包含应用程序所有内容的根布局。 你需要一个屏幕管理器来管理你必须放在里面的屏幕。 要访问.py文件中的cardimag

我正在尝试用Python和Kivy制作一个纸牌游戏,但无法显示纸牌。到目前为止,ChaseTheAce.deal随机挑选一张牌并将其从牌组中移除。我不知道如何将字符串从卡片dict传递到KV文件中的图像。我是Kivy的新手,在ID和哪些信息与PY文件中的信息匹配方面遇到了问题。感谢您的帮助,谢谢

PY文件 KV文件
编辑以删除代码中不相关的部分。

您的示例中有一些错误:

您需要一个包含应用程序所有内容的根布局。 你需要一个屏幕管理器来管理你必须放在里面的屏幕。 要访问.py文件中的cardimagefile属性,必须使用self.cardimagefile,否则您只需创建一个新的、不同的本地cardimagefile变量。 要访问.kv文件中的cardimagefile属性,必须使用app.cardimagefile 因为我没有你的图像,所以每当图像源发生变化时,我都会添加一个打印,效果很好

py代码:

卡片=['王牌黑桃','王牌黑桃'] dict={'ace_spades':'ace_of u spades.png','king_spades':'king_of u spades 2.png'} Builder.load_filecta1.kv 类登录屏幕: 通过 类游戏屏幕: 通过 课堂成绩屏幕: 通过 类WindowManager ScreenManager: 通过 类RootLayoutFloatLayout:创建根布局 通过 类别:CEAAPP: cardimagefile=StringProperty def dealself: mycard=random.choicecards cards.removemycard self.cardimagefile=dict[mycard]cardimagefile不是本地文件。 def buildself: return RootLayout必须在此处返回根布局 如果uuuu name uuuuu==\uuuuuuuu main\uuuuuuuu: 追着跑 kv代码:

:您需要根布局 WindowManager:包含屏幕管理器的 GameScreen:管理屏幕的 你不需要这个 名称:游戏屏幕 网格布局: 行数:3 图片: 身份证号码:cardimage
来源:app.cardimagefile请发布一个..我删除了所有与图像问题无关的内容。我必须将RootLayout导入我的PY吗?“返回kv”会发生什么情况?@Trippingbillies41您必须从kivy.uix.FloatLayout导入FloatLayout。您还必须使用Builder.load\u filecta1.kv线路。不过,您不需要将其分配到某个位置。。。[在我的回答中修复了它]我进行了一次编辑,编辑后出现了错误。有什么想法吗?@Trippingbillies41从登录屏幕上移开是什么意思?没有用于此的代码!。我发布的代码解决了您发布的代码的问题。它是有效的,所以你可以接受它作为一个答案。对于其他问题,您应该创建一个不同的线程。对于那些将看到这一点的人来说,有一个不断变化的问题/答案是不好的;o
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()
<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()