【问题标题】:Why kivy is not updating the position of widgets when pos_hint is changed Programmatically?当 pos_hint 以编程方式更改时,为什么 kivy 不更新小部件的位置?
【发布时间】:2019-10-31 05:16:33
【问题描述】:

我想构建一个屏幕,在按下按钮后,标签的大小和位置会发生变化:

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文件,

<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.xself.lbl.y,但我想使用self.lbl.pos_hint 更改它。我该怎么做???

这是 UI 的 ss,

我在方法callback 的末尾使用do_layout() 代替floatlayout,但是按钮现在也随着标签移动?我该如何解决这个问题?

为什么 size_hint 工作正常而 pos_hint 不工作??这背后有什么逻辑吗?

我想在每次按下 x++ 按钮时增加 pos_hint["x"] 属性以增加 0.1。

【问题讨论】:

  • 你能做一个你能想到的最小的可运行示例吗?只有一个按钮和一个标签,只能在一个方向移动。只有主要问题是必要的。不是整个程序,因为它无关紧要,只是需要查看更多代码和图像,这不包含您的主要问题。只是提供更快帮助的建议。
  • @el3ien 我已将其减少为 2 个与 pos_hint 相关的按钮

标签: python widget kivy kivy-language


【解决方案1】:

有很多方法可以做到这一点。
尝试在 pos 提示右侧和顶部使用数字属性。

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()

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-16
  • 1970-01-01
相关资源
最近更新 更多