Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Kivy布局定位问题-不了解/不正确使用_init__;,kv,kv属性_Python_Kivy - Fatal编程技术网

Python Kivy布局定位问题-不了解/不正确使用_init__;,kv,kv属性

Python Kivy布局定位问题-不了解/不正确使用_init__;,kv,kv属性,python,kivy,Python,Kivy,我是一名新程序员,也是第一次使用stackoverflow海报,所以如果我使用术语不正确,或者在礼仪或正确的编码风格上有任何其他错误,请纠正我 我想写一个游戏,你把瓷砖画到你的瓷砖架上,然后在棋盘上玩。我已经写了一个游戏,通过文本输入没有图形。现在我想用Kivy来制作一个图形界面 我的一个问题涉及小部件的定位。我想将我的机架小部件置于屏幕x轴的中心。我可以让它在那里画一个矩形,让它看起来像是在我想要它的地方,但是它的x位置是你可能猜到的0。我认为我的问题的一部分是,我已经将一个游戏对象传递给我的

我是一名新程序员,也是第一次使用stackoverflow海报,所以如果我使用术语不正确,或者在礼仪或正确的编码风格上有任何其他错误,请纠正我

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

我的一个问题涉及小部件的定位。我想将我的机架小部件置于屏幕x轴的中心。我可以让它在那里画一个矩形,让它看起来像是在我想要它的地方,但是它的x位置是你可能猜到的0。我认为我的问题的一部分是,我已经将一个游戏对象传递给我的小部件,并使用Game.symbols列表和init方法,尝试加载带有labeltext=symbol的create tile小部件,然后将它们加载到机架上。正如您可能已经猜到的,我的瓷砖也没有正确定位

我怎样才能使我的瓷砖架居中并正确装载瓷砖,使它们具有我认为碰撞检测所必需的正确位置。 请解释使用init方法和KV文件时执行它们的方式。 就我的问题而言,将对象和属性传递给小部件的正确方式是什么。我应该创建一个ObjectProperty吗? 我也可能只是对Kivy的定位和布局有一个基本的误解,如果是这样,请教育我

谢谢,, 悬崖

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

下面是使用RelativeLayout修改的RackWidget版本:


谢谢当然更好。但是,打印的位置现在与RelativeLayout关联,包括TileRackWidget的位置。我可以理解瓷砖是相对于其父代的,但机架也是相对于自身定位的?:TileRackWidget位置:[0,75]tileWidget位置:0.0,0.0 tileWidget位置:50.0,0.0 tileWidget位置:100.0,0.0 tileWidget位置:150.0,0.0 tileWidget位置:200.0,0.0 tileWidget位置:250.0,0.0 tileWidget位置:300.0,0.0这给我在使用collide_小部件时带来了问题。也许你提议的约束是一种方式?哦,我想这是同一个问题。如果您有时间的话,我想知道如何在init中正确地绑定。您可以使用Widget.to_window*pos根据Widget获取相对于窗口的坐标。
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()
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