Kivy:无法将“ BorderImage”放置在指定位置

时间:2019-02-01 19:15:05

标签: kivy kivy-language

(1)通过使用以下 kv 文件版本,可以将BorderImage小部件放置在指定位置。

<Screen>:
    ProgressBar:
        max: 100
        pos_hint: {'top':0.86, 'x':0.01}
        size_hint_x: 0.49
        size_hint_y: 0.1
        canvas:
            BorderImage:
                border: (10, 10, 10, 10)
                pos: self.x, self.center_y
                size: self.width, 8
                source: '0.png'

(2)但是,以下应实现与(1)相同功能的 Pure Python 代码无法正常工作。BorderImage小部件是放置在屏幕的底部pos_hint={'top':0.86,'x':0.01}不起作用。 我认为如何指定pos=(bar.x, bar.center_y)不好,因为bar.center_y的值与(1)的代码不同。

class BarWidget(FloatLayout):
    def __init__(self, **kwargs):
        super(BarWidget, self).__init__(**kwargs)
        self.build()
    def build(self):
        bar = ProgressBar(pos_hint={'top':0.86,'x':0.01}, max=100, size_hint_x=0.49, size_hint_y=0.1)
        with bar.canvas:
            BorderImage(border=(10, 10, 10, 10), pos=(bar.x, bar.center_y), size=(self.width/2, 8), source='0.png')
        self.add_widget(bar)

我应该如何修改bar.center_y

(1):screen shot

(2):screen shot

1 个答案:

答案 0 :(得分:0)

在kv语言中,当您设置size: self.size之类的属性时,只要“自身”窗口小部件更改形状大小,该属性就会自动更新。在屏幕/布局中加载内容时,它们从时髦的位置和大小开始,然后移动到正确的位置。如果您在kv中工作,由于更改大小/位置会自动更新,因此它可以按预期工作。

在python中,如果小部件的大小或位置继承了更改的大小和位置,则必须显式绑定某些功能以更新画布。您可以使用bind函数(在大多数/所有kivy小部件中可用)来实现。使用bind,您可以说出bind(<attribute>=<function>),这意味着在小部件的<attribute>(即大小或pos)发生更改时,它将调用<function>

由于您的代码并未全部发布,因此我并未对其进行完全测试,但这是我为我的项目所做的。让我知道它是如何工作的。如果不起作用,请将您的答案编辑为一段代码,供我复制/粘贴以使用,然后更新答案。

class BarWidget(FloatLayout):
    def __init__(self, **kwargs):
        super(BarWidget, self).__init__(**kwargs)
        self.build()
    def build(self):
        # Make it so you can reference the bar and border image later
        self.bar = ProgressBar(pos_hint={'top':0.86,'x':0.01}, max=100, size_hint_x=0.49, size_hint_y=0.1)
        with self.bar.canvas:
            # Make it so you can reference the border image
            self.border_image = BorderImage(border=(10, 10, 10, 10), pos=(bar.x, bar.center_y), size=(self.width, 8), source='0.png')
        self.add_widget(self.bar)
        # Make it so whenever the widget's pos or size changes, we update the border image
        self.bar.bind(pos=self.update_border_image, size=self.update_border_image)
    # make a function to update border image
    def update_border_image(self, *args):
        self.border_image.size = (self.width, 8) # Should this 8 be 0.8 by the way?
        self.border_image.pos = (self.bar.x, self.bar.center_y)