创建时FloatWidget发生了移位

时间:2019-11-26 12:53:21

标签: kivy python-3.7

我正在尝试创建菜单。 我将通过右键单击将其称为 它将定位在单击鼠标按钮的位置。 但是它总是在某些价值上转移。

我想做的是创建一个根窗口小部件以及包含Bubble的菜单小部件。当我单击右键时,通过在构造函数中传递touch.pos在当前位置创建新的菜单小部件实例。 当我发现它在相同距离上移动菜单小部件

Builder.load_string('''
<main_window_menu>:
    size_hint: (None, None)
    size: (160, 80)
    pos_hint: {'center_x': .5, 'y': .3}
    BubbleButton:
        text: 'New'
        on_press: root.new()
''')

class main_window_menu(Bubble):
    def __init__(self, **kwargs):
        super().__init__()
        self._new = kwargs["new"]


def new(self):
    self._new()

class Menu(FloatLayout):

    def __init__(self, pos, **kwargs):
    super().__init__(pos=pos)
    self.show_bubble(**kwargs)

    def show_bubble(self, **kwargs):
        self.bubb = main_window_menu(**kwargs)
        self.add_widget(self.bubb)

    def on_touch_down(self, touch):
        self.bubb.on_touch_down(touch)

class Frame(FloatLayout):
    def __init__(self):
        super().__init__()

    def on_touch_down(self, touch):
        print(touch.pos)
        super().on_touch_down(touch)
        print(touch.pos)
        if touch.button == 'right':
            menu = Menu(pos=touch.pos, new=self.new_operation)
            self.add_widget(menu)

    def new_operation(self):
        pass

class MyApp(App):
    def build(self):
        tt = Frame()
        return tt

if __name__ == '__main__':
    MyApp().run()

1 个答案:

答案 0 :(得分:0)

我认为您的代码有两个问题。

首先,使用

pos_hint: {'center_x': .5, 'y': .3}

main_window_menu实例内的Menu放在右边('center_x':0.5)上方('y':。3)。 Menu Widget位于touch坐标处,因此main_window_menu及其BubbleButton位于touch的右侧和上方

第二,在FloatLayout的基类中使用Menu表示您对子元素的绝对定位或使用pos_hint感到困惑。

因此,我建议删除pos_hint并使用RelativeLayout作为Menu的基础,然后将pos的默认(0,0)放在{ {1}}在BubbleButton位置。

这是使用我的建议的代码的修改版本:

touch