Проблемы с разбросом размера и положения
Я столкнулся с некоторой проблемой, связанной с рассеянным объектом. Из моих кодов ниже. После того, как я изменил размер Scatter
(self.size_hint_x
, self.size_hint_y = 0.3, 0.3
), объекты (canvas
, label
) внутри Scatter
также не изменяется. Я пытался подать заявку size_hint=1
к Canvas
а также Label
внутри Scatter
Однако результат все тот же.
Еще одна проблема, с которой я столкнулся, это получение X, Y
положение (относительно родителя) для Canvas
/ Label
в Scatter
, Это всегда дает мне (0,0)
,
Мой код
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.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
class GameBackground(FloatLayout):
def __init__(self, **kwargs):
super(GameBackground, self).__init__(**kwargs)
with self.canvas:
Color(1, 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.
class GameApp(App):
def build(self):
return GameBackground()
if __name__ == '__main__':
GameApp().run()
Я что-то пропустил? Спасибо за любой совет.
Я новичок в Киви. Прошу прощения, если мой QNS немой. :П
1 ответ
Вы читали документацию по Scatter вообще. Это говорит о том, что
... специфическое поведение делает разброс уникальным, и есть некоторые преимущества / ограничения, которые вы должны учитывать:
- Дети расположены относительно 0, 0. Положение разброса не влияет на положение детей.
- Это относится и к размеру. Если вы хотите изменить размер разброса, используйте масштаб, а не размер. (читай №1)
Это ответ на ваш первый вопрос. Он говорит, что используйте масштаб, а не размер. Существует также метод apply_transform, который может оказаться полезным для других преобразований. Я никогда не пробовал этот метод, но я не вижу значение перевода (я вижу Поворот и Масштаб)
Относительно вашего второго вопроса. Вы добавляете прямоугольник в self.x
а также self.y
положение, которое (0,0). Итак, ваш прямоугольник находится в этом положении. Если вы перетащите (используя пальцы или мышь) свой виджет. Положение прямоугольника остается относительно Scatter
, Таким образом, если вы не измените положение прямоугольника (с кодом), он всегда будет в (0,0). Преобразования всегда относительно Scatter.
Этот вопрос может быть связан и объясняет несколько проблем, связанных с неиспользованием языка 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()