【发布时间】:2014-05-29 15:53:12
【问题描述】:
经典的常识编程将 GUI 代码与核心处理分开。我在 Kivy 开始采用这种方式,但在我的第一轮原型中遇到了问题。
deck.py
>class Card:
def __init__(self, suit, value):
self.name = "%s %s" % (suit, value)
main.py
>from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.properties import ObjectProperty
from deck import Card
class CardDisplay(BoxLayout):
card = ObjectProperty(Card("Default", 0))
class BoardDisplay(BoxLayout):
board = [[Card("Player1", 1),
Card("Player1", 2),
Card("Player1", 3),
Card("Player1", 4)],
[Card("Player2", 1),
Card("Player2", 2),
Card("Player2", 3),
Card("Player2", 4)]]
class GameApp(App):
pass
if __name__ in ("__main__", "__android__"):
GameApp().run()
game.kv
BoardDisplay:
orientation: "vertical"
BoxLayout:
CardDisplay:
card: root.board[0][0]
CardDisplay:
card: root.board[0][1]
CardDisplay:
card: root.board[0][2]
CardDisplay:
card: root.board[0][3]
BoxLayout:
CardDisplay:
card: root.board[1][0]
CardDisplay:
card: root.board[1][1]
CardDisplay:
card: root.board[1][2]
CardDisplay:
card: root.board[1][3]
<CardDisplay>:
Label:
text: root.card.name
运行此程序,我得到了预期的 8 张卡片显示,但所有卡片均为“默认 0”。我认为这是因为我使用的是 root.card.name,它不是 StringProperty,而只是卡片类的一个属性。但是......有什么更好的方法来做到这一点?我真的应该在每个包含我想要显示的东西(在本例中为 Card)的类中从 Widget(或类似的东西)继承吗?还是有我无法理解的绑定方法?我通读了 Kivy 文档,可以发誓它提到了一个像这样的问题,但我无法再次找到参考...
【问题讨论】: