【发布时间】:2020-07-21 11:09:25
【问题描述】:
我一直在尝试使用 pos_hint 在 FloatLayout 中定位 kivy 中的小部件。 如果标签从一开始就存在,例如如果我可以在 .kv 文件中定义 pos_hint,一切都会按预期工作。但是,我稍后会尝试创建按钮。使用这个 .kv 文件(名为 layouttest.kv):
<NewButton@Button>:
size_hint: (0.1, 0.1)
<BasicFloatLayout@FloatLayout>:
Button:
size_hint: (0.4, 0.2)
pos_hint: {'x': 0.0, 'top': 1.0}
text: 'create Button'
on_release: self.parent.create_Button()
和这个 python 代码,我试图将新创建的空白按钮放置在我的 BasicFloatLayout 大小的 0%-100% 范围内的随机 y 位置,以及 0-200px 范围内的随机 x 位置。 如果我按下按钮一次,一切都会按预期运行。在第二次按下时,第一个创建的按钮将更改其 y 位置,使其与新创建的按钮相同。第三次按下时,两个旧按钮都将与新创建的按钮对齐,依此类推。然而,x 定位将保持如预期的那样。有人可以解释一下我在这里做错了什么吗? (如果您可以帮助我使用更新功能和 pos_hint 移动按钮,则可以加分)
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.button import Button
from kivy.properties import NumericProperty
from kivy.clock import Clock
import random
class BasicFloatLayout(FloatLayout):
timer = NumericProperty(0)
def update(self, *args):
self.timer += 1
for child in self.children:
try: child.update()
except AttributeError:
pass
def create_Button(self):
button = NewButton( (random.random(), random.random()) )
self.add_widget(button)
class NewButton(Button):
def __init__(self, pos, **kwargs):
super(NewButton, self).__init__(**kwargs)
self.pos[0] = 200*pos[0]
self.pos_hint['y'] = pos[1]
class layouttestApp(App):
def build(self):
GUI = BasicFloatLayout()
Clock.schedule_interval(GUI.update, 1/30.)
return GUI
if __name__ == "__main__":
layouttestApp().run()
【问题讨论】: