【发布时间】:2015-04-27 01:17:19
【问题描述】:
我已经开始玩 Kivy,但我对这一切还很陌生,并且已经在苦苦挣扎。
我正在尝试制作棋盘游戏 - 我希望窗口可以调整大小,但我不希望调整窗口大小以弄乱游戏的纵横比(换句话说,我希望窗口如果窗口的大小调整为内容的预期纵横比以外的大小,则在内容上方或两侧会出现黑条)
我认为确保这一点的最简单方法是:
a) 锁定窗口本身的纵横比,使其始终为 10:9(板和所有屏幕元素的纵横比) - 即使是全屏。
或
b) 使用某种以窗口为中心并锁定 10:9 纵横比的小部件/表面/布局。然后,我随后将其用作放置所有其他图像、小部件、网格等的基础。
但是,我真的不知道该怎么做。我不确定我是否可以锁定窗口纵横比,我发现的唯一可以让我锁定纵横比的特定于 kivy 的对象来自 kivy.graphics.image ......我似乎不是能够用作我其他东西的“基础”。
编辑:到目前为止,我已经编写了以下代码:它创建了一个布局(并将其着色为略带红色),每当调整大小时“修复”它自己的纵横比。但是,它仍然没有在窗口中居中,而且更成问题的是,它会导致无限循环(可能是因为方面修复代码更正了大小,但随后 kivy 将其大小“更正”回了窗口的大小,再次触发方面修复,以为我可能错了)。
编辑:再次修改代码,但它仍然是一个无限循环。我虽然只参考父母的尺寸信息可以解决这个问题,但显然不是。
如果有人帮助我修复我的代码,我将不胜感激。
代码如下:
test.py
from kivy.app import App
from kivy.uix.widget import Widget
from kivy.uix.image import Image
from kivy.uix.anchorlayout import AnchorLayout
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.relativelayout import RelativeLayout
from kivy.properties import (ObjectProperty,
NumericProperty,
ReferenceListProperty)
from kivy.graphics.context_instructions import Color
from kivy.graphics.vertex_instructions import Rectangle
class Board(AnchorLayout):
pass
class BackgroundLayout(RelativeLayout):
def FixAspectRatio(self, *args):
correctedsize = self.parent.size
if correctedsize[0] > correctedsize[1]*(10/9):
correctedsize[0] = correctedsize[1]*(10/9)
elif correctedsize[0] < correctedsize[1]*(10/9):
correctedsize[1] = correctedsize[0]/(10/9)
return correctedsize
class test(App):
game = ObjectProperty(None)
def build(self):
self.game = Board()
return self.game
if __name__ == '__main__':
test().run()
test.kv
<Board>
BackgroundLayout:
canvas.before:
Color:
rgba: 1, 0, 0, 0.5
Rectangle:
size: self.size
pos: self.pos
size: self.FixAspectRatio(self.parent.size)
pos: self.parent.pos
【问题讨论】:
标签: python layout resize kivy aspect-ratio