为什么更改pos_hint属性而不在运行时更改窗口小部件的位置?

时间:2019-10-29 11:46:11

标签: python kivy kivy-language

我正在创建按钮,on_press可以移动另一个按钮。 这是它的视图...

Screenshot of UI

我无法发布图片,但是我给出了链接

我正在更改按钮事件的pos_hint属性,但该小部件并未随之移动。实际上它甚至没有移动一个像素:) 是的,我知道我可以更改widget.xwidget.y属性来移动小部件,但是我想知道是否有可能使用pos_hint进行更改

编辑:我正在python 3.x和debain OS上使用

我尝试将button.pos_hint分配给字典,然后对其进行更改,然后再次将其分配给button.pos_hint 这就是我在说的

new_dict = some_button.pos_hint
#changing new_dict here...
some_button.pos_hint = new_dict

main.py->

from kivy.app import App
from kivy.uix.label import Label
from kivy.uix.textinput import TextInput
from kivy.uix.gridlayout import GridLayout
from kivy.uix.button import Button
from kivy.properties import ObjectProperty
from kivy.uix.widget import Widget
from kivy.uix.floatlayout import FloatLayout
from kivy.properties import DictProperty

class Login2(FloatLayout):

    btn_demo = ObjectProperty(None)

    def just(self, arg):
        if arg == "x++":
            print(self.btn_demo.pos_hint)
            if "x" in self.btn_demo.pos_hint.keys():
                self.btn_demo.pos_hint["x"] += 0.1
            else:
                self.btn_demo.pos_hint["x"] = 0
        elif arg == "top--":
            print(self.btn_demo.pos_hint)
            if "top" in self.btn_demo.pos_hint.keys():
                self.btn_demo.pos_hint["top"] -= 0.1
            else:
                self.btn_demo.pos_hint["top"] = 0

class MainApp(App):

    def build(self):
        return Login2()


if __name__ == "__main__":
    MainApp().run()

kv文件->

<Login2>
    btn_demo:btn_demo
    GridLayout:
        cols:1
        size: root.width,root.height

        FloatLayout:
            Button:
                pos_hint:{"top":1,"x":0.3}
                size_hint:0.2,0.2
                id:btn_demo
                text:"Demo"


        GridLayout:
            size_hint: 1,0.2
            cols:6

            Button:
                text:"x++"
                on_press:root.just("x++")
            Button:
                text:"x--"
                on_press:root.just("x--")
            Button:
                text:"y++"
                on_press:root.just("y++")
            Button:
                text:"y--"
                on_press:root.just("y--")
            Button:
                text:"top++"
                on_press:root.just("top++")
            Button:
                text:"top--"
                on_press:root.just("top--")
            Button:
                text:"bot++"
                on_press:root.just("bot++")
            Button:
                text:"bot--"
                on_press:root.just("bot--")
            Button:
                text:"rgt++"
                on_press:root.just("rgt++")
            Button:
                text:"rgt--"
                on_press:root.just("rgt--")
            Button:
                text:"lef++"
                on_press:root.just("lef++")
            Button:
                text:"lef--"
                on_press:root.just("lef--")

我如何使用pos_hint来更改按钮小部件的位置?

解决方案::::> 调用layout_instance.do_layout()以使更改显示在屏幕上... 就是这样:

#change co-ordinates you want on widget_instance
#then call widget_instance's parent layout's do_layout() method

1 个答案:

答案 0 :(得分:0)

您应该在"right"中使用"x"而不是pos_hint

此示例有效:

from kivy.app import App
from kivy.lang import Builder

KV = """

FloatLayout:
    Button:
        text: "hello"
        id: hello
        size_hint: 0.1, 0.1
        pos_hint: {"top":0.3, "right": 0.5}
        on_release:
            world.pos_hint = {"top":0.1, "right": 0.1}
    Button:
        id: world
        text: "world"
        size_hint: 0.1, 0.1
        pos_hint: {"top":0.5, "right": 0.9}
        on_release:
            world.pos_hint = {"top":0.9, "right": 0.9}

"""

class MyApp(App):

    def build(self):
        return Builder.load_string(KV)


MyApp().run()