我一直在尝试使用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代码,我试图将新创建的空白按钮定位在随机的y位置,其范围为我BasicFloatLayout大小的0%-100%,并且在随机的x位置,范围为0-200px。 如果我按一下按钮,一切都会按预期进行。第二次按下时,第一个创建的按钮将更改其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()
答案 0 :(得分:0)
首先,使pos_hint: {'x': 0.0, 'y': 0.5}
(因为很难使两种不同的方法同时起作用,如果使用x,则使用y代替Top,如果使用top,然后使用x的底部插入)
第二,不要在kv文件中提供on_release: self.parent.create_Button()
,而是这样做:on_release: root.create_Button()
第三,您只分配了y值,还应该分配了x值,这行在NewButton类中是self.pos_hint['y'] = pos[1]
。
但是您可以通过以下操作使其更简单:
#from your first class......
def create_Button(self):
button = NewButton(self.pos_hint{'x' : random.random(), 'y' : random.random()}
self.add_widget(button)
class NewButton(Button):
def __init__(self, *kwargs):
pass
希望这有意义,您可以对其进行更多修改。 (注意:我还没有写您的主要课程的开始部分,我很懒;;-p)