我正在尝试创建菜单。 我将通过右键单击将其称为 它将定位在单击鼠标按钮的位置。 但是它总是在某些价值上转移。
我想做的是创建一个根窗口小部件以及包含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()
答案 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