Kivy布局定位问题不理解/未正确使用\uhu init_u2;,kv,kv属性

2024-09-28 05:28:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我是一个新的程序员(和第一次stackoverflow海报),所以请纠正我,如果我使用的术语不正确,或在礼仪或适当的编码风格的任何其他错误步骤。在

我试着写一个游戏,你画瓷砖到你的瓷砖架上,然后在板上玩。我已经写了一个游戏,没有图形通过文字输入。现在我想用Kivy制作一个图形界面。在

我的问题之一是小部件的定位。我想把我的机架部件放在屏幕x轴的中心。我可以让它在那里画一个矩形,让它看起来像是我想要的位置,但是它的x位置是(正如你可能猜到的)0。我想我的部分问题是我已经把一个游戏对象传递给了我的小部件并使用了一个符号列表(游戏符号)在一个init方法中,我尝试用标签(text=symbol)加载createtile小部件,然后将它们加载到机架上。正如您可能已经猜到的,我的瓷砖也没有正确定位。在

  1. 如何使我的瓷砖架居中并正确装载瓷砖,使它们具有正确的位置(我认为这是碰撞检测所必需的)。在
  2. 请解释init方法和KV文件在使用时的执行方式。在
  3. 就我这里的问题而言,向小部件传递对象和属性的正确方法是什么。我应该创建ObjectProperty吗?在

我也可能只是对Kivy的定位和布局有一个基本的误解,如果是,请教育我。在

谢谢你, 悬崖

import kivy
kivy.require('1.7.0')
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.scatter import Scatter
from kivy.uix.label import Label

kv_Game= '''
<TileWidget>:
    size_hint: None, None
    size: 50,50
    canvas.before:
        Color:
            rgba: 0.5,0.5,1,0.3
        Rectangle:
            size: self.width, self.height

    canvas.after:
        Line:
            rectangle: self.x, self.y, self.width, self.height
            dash_offset: 5
            dash_length: 3

<RackWidget>:

    size_hint: None, None
    size: 350, 50
    pos_hint: {'center_x': 0.5}
    y: 75

    canvas.after:
        Color:
            rgba: 1,0,0,0.5
        Line:
            rectangle: self.x, self.y, self.width, self.height
'''

Builder.load_string(kv_Game)

class Game(FloatLayout):

    def __init__(self, **kwargs):
        super(Game, self).__init__(**kwargs)
        self.symbols = ['!','@','#','$','%','^','&']
        self.rackWidget = RackWidget(self)
        self.add_widget(self.rackWidget)

class TileWidget(Scatter):

    def __init__(self, symbol="?", **kwargs):
        super(TileWidget, self).__init__(**kwargs)
        tileLabel = Label(text=symbol, size_hint=(None,None), size=(50,50))
        self.add_widget(tileLabel)

class RackWidget(FloatLayout):

    def __init__(self, game, **kwargs):
        super(RackWidget, self).__init__(**kwargs)
        print("TileRackWidget pos:", self.pos)

        x, y = self.pos
        for symbol in game.symbols:
            tileWidget = TileWidget(symbol=symbol, pos= (x,y))
            self.add_widget(tileWidget)
            print("tileWidget pos:", tileWidget.pos)
            x+=50

class GameTest1App(App):
    def build(self):

        game = Game()
        return game

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

Tags: fromposimportselfnonegame游戏size
1条回答
网友
1楼 · 发布于 2024-09-28 05:28:30

当您创建RackWidget实例时,pos尚未设置为可用值。当__init__正在运行时,该小部件尚未添加到Game小部件中,因此它没有父部件,也没有定位信息。您可以通过绑定到RackWidget.pos中的更改来解决此问题,但有一种更简单的方法:^{}RelativeLayout的每个子级的位置将基于布局本身的位置。在

以下是RackWidget的修改版本,使用RelativeLayout

class RackWidget(RelativeLayout):

    def __init__(self, game, **kwargs):
        super(RackWidget, self).__init__(**kwargs)
        print("TileRackWidget pos:", self.pos)

        x, y = 0, 0
        for symbol in game.symbols:
            tileWidget = TileWidget(symbol=symbol, pos= (x,y))
            self.add_widget(tileWidget)
            print("tileWidget pos:", tileWidget.pos)
            x+=50

相关问题 更多 >

    热门问题