Почему изменение свойства pos_hint не меняет положение виджета во время выполнения? - PullRequest
2 голосов
/ 29 октября 2019

Я создаю кнопки, которые on_press выполняет движение другой кнопки. Это вид ...

Screenshot of UI

Я не могу опубликовать изображение, но я дал ссылку

Я изменяю свойство pos_hint для событий кнопкино виджет не движется в соответствии с этим. На самом деле он не перемещается даже на пиксель :) Я знаю, что могу изменить свойства widget.x и widget.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 file ->

<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, чтобы изменить положение виджета кнопки ???

SOLUTION ::::> вызовите 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 голосов
/ 29 октября 2019

Вы должны использовать "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()
...