GridLayout 的 children 的 Kivy 位置总是 returns (0,0)
Kivy position of a GridLayout's children always returns (0,0)
当我向 GridLayout 添加一些元素时,如果想获取元素位置,Kivy 总是 returns (0,0),但事实并非如此,因为元素正确定位在我的 windows.
class ImageButton(ButtonBehavior, Label):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.text = 'hello'
def add_sources(self, sources):
print(self.pos) #(0,0), but is not (0,0)
self.add_widget(Label(text='foo', pos=self.pos))
这是我的主要 class。
class MyClass(Widget):
my_layout = ObjectProperty(GridLayout())
def __init__(self):
super().__init__()
self.load_layout()
def load_map(self):
self.my_layout.rows = 2
self.my_layout.cols = 2
self.draw_ui()
def draw_ui(self):
a = ImageButton()
b = ImageButton()
c = ImageButton()
d = ImageButton()
self.my_layout.add_widget(a)
self.my_layout.add_widget(b)
self.my_layout.add_widget(c)
self.my_layout.add_widget(d)
a.add_sources(0)
b.add_sources(1)
c.add_sources(0)
d.add_sources(1)
为什么获取小部件的位置 returns 我 (0,0)?我究竟做错了什么?
这是我得到的:
但我想要每个 "hello" 字符串前面的 "foo" 字符串。
我该怎么做?
打印时,在kivy GUI循环的第一帧,pos等于[0,0]。稍后会更改。你有两种方法可以解决这个问题:
- 等到第二帧,pos按预期更新。
- 绑定pos而不是一开始就赋值一次
解决方案 1) 示例:
from kivy.clock import mainthread
class ImageButton(ButtonBehavior, Label):
...
@mainthread
def add_sources(self, sources):
self.add_widget(Label(text='foo', pos=self.pos))
解决方案 2) 示例:
class ImageButton(ButtonBehavior, Label):
...
def add_sources(self, sources):
self.add_widget(Label(text='foo', pos=self.setter('pos')))
当我向 GridLayout 添加一些元素时,如果想获取元素位置,Kivy 总是 returns (0,0),但事实并非如此,因为元素正确定位在我的 windows.
class ImageButton(ButtonBehavior, Label):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.text = 'hello'
def add_sources(self, sources):
print(self.pos) #(0,0), but is not (0,0)
self.add_widget(Label(text='foo', pos=self.pos))
这是我的主要 class。
class MyClass(Widget):
my_layout = ObjectProperty(GridLayout())
def __init__(self):
super().__init__()
self.load_layout()
def load_map(self):
self.my_layout.rows = 2
self.my_layout.cols = 2
self.draw_ui()
def draw_ui(self):
a = ImageButton()
b = ImageButton()
c = ImageButton()
d = ImageButton()
self.my_layout.add_widget(a)
self.my_layout.add_widget(b)
self.my_layout.add_widget(c)
self.my_layout.add_widget(d)
a.add_sources(0)
b.add_sources(1)
c.add_sources(0)
d.add_sources(1)
为什么获取小部件的位置 returns 我 (0,0)?我究竟做错了什么?
这是我得到的:
但我想要每个 "hello" 字符串前面的 "foo" 字符串。
我该怎么做?
打印时,在kivy GUI循环的第一帧,pos等于[0,0]。稍后会更改。你有两种方法可以解决这个问题:
- 等到第二帧,pos按预期更新。
- 绑定pos而不是一开始就赋值一次
解决方案 1) 示例:
from kivy.clock import mainthread
class ImageButton(ButtonBehavior, Label):
...
@mainthread
def add_sources(self, sources):
self.add_widget(Label(text='foo', pos=self.pos))
解决方案 2) 示例:
class ImageButton(ButtonBehavior, Label):
...
def add_sources(self, sources):
self.add_widget(Label(text='foo', pos=self.setter('pos')))