Почему kivy не обновляет положение виджетов, когда pos_hint изменяется программно? - PullRequest
0 голосов
/ 31 октября 2019

Я хочу создать экран, на котором при следующих нажатиях кнопок происходит изменение размера и положения этикетки:

Button : Changes
x++   -> x co-ordinate of label increments by 0.1 in pos_hint property
x--   -> x co-ordinate of label decrements by 0.1 in pos_hint property

До сих пор я пробовал это,

from kivy.app import App
from kivy.uix.widget import Widget
from kivy.uix.label import Label
from kivy.uix.scatter import Scatter
from kivy.uix.floatlayout import FloatLayout
from kivy.properties import ObjectProperty



class Screen(Widget):
    lbl = ObjectProperty(None)

    def __init__(self, **kwargs):
        super(Screen, self).__init__(**kwargs)
        self.count_x = 0.1

    def print_pos_change(self,instance,value):
        print(instance,"Moved to", value)

    def callback(self,arg):
        if arg == "x++":
            self.count_x+=0.1
            self.lbl.pos_hint["x"] = self.count_x
        elif arg == "x--":
            self.count_x-=0.1
            self.lbl.pos_hint["x"] = self.count_x

class WidgetEx(App):
    kv_directory = "kv-files"

    def build(self):
        return Screen()


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

Вотkv file,

<Screen>
    lbl:lbl
    FloatLayout:
        size:root.width,root.height
        Label:
            id:lbl
            text:"Hello"
            size_hint:0.5,0.5
            on_pos:root.print_pos_change(self,self.pos)
            canvas:
                Color:
                    rgba: 0, 0, 1, 1
                Rectangle:
                    pos:self.pos
                    size:self.size
        GridLayout:
            cols:2
            size_hint:1,0.1
            Button:
                text:"x++"
                on_press:root.callback("x++")
            Button:
                text:"x--"
                on_press:root.callback("x--")

Теперь проблема в том, что ни позиция не меняется, ни print_pos_change вызывается во время изменения.

Я знаю, что могу напрямую использовать self.lbl.x и self.lbl.y, ноя хочу изменить его, используя self.lbl.pos_hint. Как мне это сделать?

Вот сс интерфейса пользователя, Image of UI

Я использовал do_layout() для floatlayout в конце метода callback, но кнопкитакже теперь перемещается с метками ?? Как это исправить?

Почему size_hint работает правильно, а pos_hint нет? Есть ли за этим логика?

Я хочу увеличить pos_hint["x"] свойство увеличивать на 0,1 при каждом нажатии кнопки x++.

1 Ответ

0 голосов
/ 31 октября 2019

Есть много способов сделать это.
Попробуйте использовать числовое свойство в правой и верхней подсказке.

from kivy.app import App
from kivy.uix.widget import Widget
from kivy.properties import NumericProperty
from kivy.lang import Builder

KV = """

MyWidget:
    FloatLayout:
        size:root.width,root.height
        Label:
            text:"Hello"
            size_hint:0.5,0.5
            pos_hint: {"top":root.pos_hint_top, "right":root.pos_hint_right}
            canvas.before:
                Color:
                    rgba: 0, 0, 1, 1
                Rectangle:
                    pos:self.pos
                    size:self.size
        GridLayout:
            cols:2
            size_hint:1,0.1
            Button:
                text:"x++"
                on_press:root.callback("x++")
            Button:
                text:"x--"
                on_press:root.callback("x--")

"""

class MyWidget(Widget):
    pos_hint_right = NumericProperty(0.5)
    pos_hint_top = NumericProperty(0.5)

    def callback(self,arg):
        if arg == "x++":
            self.pos_hint_right += 0.1
        elif arg == "x--":
            self.pos_hint_right -= 0.1

class WidgetEx(App):
    def build(self):
        return Builder.load_string(KV)


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