如何使用pos_hint将Kivy小部件放置在floatlayout中?

时间:2020-07-21 11:09:25

标签: python kivy

我一直在尝试使用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()

1 个答案:

答案 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)