Python Kivy布局定位问题-不了解/不正确使用_init__;,kv,kv属性
我是一名新程序员,也是第一次使用stackoverflow海报,所以如果我使用术语不正确,或者在礼仪或正确的编码风格上有任何其他错误,请纠正我 我想写一个游戏,你把瓷砖画到你的瓷砖架上,然后在棋盘上玩。我已经写了一个游戏,通过文本输入没有图形。现在我想用Kivy来制作一个图形界面 我的一个问题涉及小部件的定位。我想将我的机架小部件置于屏幕x轴的中心。我可以让它在那里画一个矩形,让它看起来像是在我想要它的地方,但是它的x位置是你可能猜到的0。我认为我的问题的一部分是,我已经将一个游戏对象传递给我的小部件,并使用Game.symbols列表和init方法,尝试加载带有labeltext=symbol的create tile小部件,然后将它们加载到机架上。正如您可能已经猜到的,我的瓷砖也没有正确定位 我怎样才能使我的瓷砖架居中并正确装载瓷砖,使它们具有我认为碰撞检测所必需的正确位置。 请解释使用init方法和KV文件时执行它们的方式。 就我的问题而言,将对象和属性传递给小部件的正确方式是什么。我应该创建一个ObjectProperty吗? 我也可能只是对Kivy的定位和布局有一个基本的误解,如果是这样,请教育我 谢谢,, 悬崖 创建RackWidget实例时,pos尚未设置为可用值。当_init _运行时,小部件尚未添加到游戏小部件中,因此它没有父部件,也没有定位信息。您可以通过绑定RackWidget.pos中的更改来解决此问题,但有一种更简单的方法:。RelativeLayout的每个子级的位置将基于布局本身的位置 下面是使用RelativeLayout修改的RackWidget版本:Python Kivy布局定位问题-不了解/不正确使用_init__;,kv,kv属性,python,kivy,Python,Kivy,我是一名新程序员,也是第一次使用stackoverflow海报,所以如果我使用术语不正确,或者在礼仪或正确的编码风格上有任何其他错误,请纠正我 我想写一个游戏,你把瓷砖画到你的瓷砖架上,然后在棋盘上玩。我已经写了一个游戏,通过文本输入没有图形。现在我想用Kivy来制作一个图形界面 我的一个问题涉及小部件的定位。我想将我的机架小部件置于屏幕x轴的中心。我可以让它在那里画一个矩形,让它看起来像是在我想要它的地方,但是它的x位置是你可能猜到的0。我认为我的问题的一部分是,我已经将一个游戏对象传递给我的
谢谢当然更好。但是,打印的位置现在与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