散点大小和位置的问题

时间:2013-06-19 07:54:10

标签: python kivy

我遇到了一些与分散对象有关的问题。 从下面的代码。在调整Scatterself.size_hint_xself.size_hint_y = 0.3, 0.3)的大小后,canvas内的对象(labelScatter)也未调整大小。我确实尝试将size_hint=1应用于Canvas内的LabelScatter,但结果仍然相同。

我遇到的另一个问题是检索X, YCanvas / Label的{​​{1}}位置(相对于父级)。它总是给我Scatter

我的代码

(0,0)

我错过了什么吗?谢谢你的任何建议。

我是Kivy的新手。如果我的qns愚蠢,那么请原谅我。 :P

1 个答案:

答案 0 :(得分:5)

您是否完全阅读了Scatter的文档?它说

  

...特定行为使得分散是唯一的,您应该考虑一些优势/约束:

     
      
  1. 孩子们的位置相对于0,0。分散位置对孩子的位置没有影响。
  2.   
  3. 这也适用于尺寸。如果要调整散点大小,请使用缩放,而不是大小。 (读#1。)
  4.   

回答你的第一个问题。它表示使用规模,而不是规模。还有方法apply_transform,您可能会发现它对其他转换很有用。我从未尝试过这种方法,但我看不到翻译值(我可以看到旋转和缩放)

关于你的第二个问题。您正在self.xself.y位置添加一个矩形,即(0,0)。所以,你的Rectangle就在那个位置。如果您拖动(使用手指或鼠标)您的小部件。 Rectangle的位置保持相对于Scatter。因此,除非您更改Rectangle的位置(使用代码),否则它将始终位于(0,0)中。转换始终与Scatter相关。

This question可能是相关的,并解释了一些未使用Kivy语言添加顶点指令(即矩形)的问题。你应该考虑它,因为你在做什么似乎是相关的。

*编辑 - 根据我对您要实现的目标的理解,只是必然的更正*

1)请勿使用您正在使用的尺寸提示。

1.1)而不是:

self.lbl = Label(text='Test', size_hint_x=1, size_hint_y=1)

使用:

self.lbl = Label(text='Test', width=self.width, height=self.height)

1.2)并且,而不是:

self.size_hint_x, self.size_hint_y = 0.3, 0.3

使用:

self.scale = 0.3

2)该位置相对于分散。因此,您需要将坐标转换为父坐标。

2.1)而不是:

print self.elf.lbl.pos  #<-- ISSUE: This not working.

使用:

print self.elf.to_parent(*self.elf.lbl.pos)

以下是完整的代码:

from kivy.app import App
from kivy.core.window import Window
from kivy.uix.widget import Widget
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.label import Label
from kivy.uix.scatter import Scatter
from kivy.graphics import Color, Rectangle, Canvas

class Avatar(Scatter):
    def __init__(self, **kwargs):
        super(Avatar, self).__init__(size_hint=(None,None), **kwargs)

        with self.canvas:
            Color(0, 0, 0)
            Rectangle(pos=(self.x, self.y), size=(self.width, self.height))

        #self.lbl = Label(text='Test', size_hint_x=1, size_hint_y=1)
        self.lbl = Label(text='Test', width=self.width, height=self.height)
        self.add_widget(self.lbl)

        # Scatter size is 30% of the GameBackground
        # ISSUE: After resize my Scatter, the objects inside is not resized as well.
        # self.size_hint_x, self.size_hint_y = 0.3, 0.3
        self.scale = 0.3


class GameBackground(FloatLayout):
    def __init__(self, **kwargs):
        super(GameBackground, self).__init__(**kwargs)

        with self.canvas:
            Color(0, 0, 1)
            Rectangle(pos = (0, 0), size = (Window.width,Window.height))

        self.elf = Avatar()
        self.add_widget(self.elf)
        self.elf.x = 200
        self.elf.y = 300

        # Get the X, Y position of the Scatter and the label inside the Scatter relative to the parent.
        print self.elf.pos      #<-- This works.
        print self.elf.lbl.pos  #<-- ISSUE: This not working.
        print self.elf.to_parent(*self.elf.lbl.pos)

class GameApp(App):
    def build(self):
        return GameBackground()

if __name__ == '__main__':
    GameApp().run()
相关问题