我已经开始和Kivy一起玩,但是我对这一切还比较陌生,已经很挣扎了。

我正在尝试制作棋盘游戏-我希望窗口可调整大小,但我不想调整窗口大小以弄乱游戏的长宽比(换句话说,我希望窗口具有黑条如果将窗口的大小调整为内容的预期长宽比以外的其他值,则位于内容的上方或侧面

我可以看到的最简单的方法是:

a)锁定Window的纵横比,使其始终为10:9(面板和所有屏幕元素的纵横比)-即使在全屏模式下也是如此。

要么

b)使用某种窗口小部件/表面/布局,该窗口小部件/表面/布局以窗口为中心并具有锁定的10:9长宽比。然后,我随后将其用作所有其他图像,小部件,网格等放置的基础。

但是,我真的不知道该怎么做。我不确定是否可以锁定Window的宽高比,而我发现的唯一可以锁定高宽比的特定于kivy的对象是来自kivy.graphics.image ...,我似乎不是可以用作我其他东西的“基础”。

编辑:到目前为止,我已经编写了以下代码:它创建了一个布局(并将其颜色涂成红色),每当调整大小时便“修复”其自身的纵横比。但是,它仍然没有位于窗口的中心,更成问题的是,它导致了一个无限循环(可能是因为方面修复程序代码纠正了大小,但后来猕猴桃将其大小“纠正”回了窗口的大小,再次触发方面修复,以为我可能是错的。

编辑:再次修改了代码,但它仍然是一个无限循环。我虽然只引用父项的大小信息可以解决此问题,但显然不能解决。

感谢任何帮助我修复代码的人。

代码如下:

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()


测试文件

<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

最佳答案

一种方法是创建一个布局,该布局始终在给定宽高比的情况下最大化子级。这是一个例子:

from kivy.lang import Builder
from kivy.app import App
from kivy.uix.relativelayout import RelativeLayout
from kivy.properties import NumericProperty

kv = """
ARLayout:
    Widget:
        canvas:
            Color:
                rgb: 1, 0, 0
            Rectangle:
                size: self.size
                pos: self.pos
"""

class ARLayout(RelativeLayout):
    # maximize the children given the ratio
    ratio = NumericProperty(10 / 9.)

    def do_layout(self, *args):
        for child in self.children:
            self.apply_ratio(child)
        super(ARLayout, self).do_layout()

    def apply_ratio(self, child):
        # ensure the child don't have specification we don't want
        child.size_hint = None, None
        child.pos_hint = {"center_x": .5, "center_y": .5}

        # calculate the new size, ensure one axis doesn't go out of the bounds
        w, h = self.size
        h2 = w * self.ratio
        if h2 > self.height:
            w = h / self.ratio
        else:
            h = h2
        child.size = w, h


class TestApp(App):
    def build(self):
        return Builder.load_string(kv)

TestApp().run()

关于python - 如何确定游戏的纵横比?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28712359/

10-12 20:09