所以我对 Kivy 很陌生,到目前为止非常令人沮丧......无论如何,我现在正在尝试制作一个可以拖动和移动的弹出窗口,但我不明白发生了什么...... ..当我在 onButtonPress 函数中调用 popup.open() 时,弹出窗口可以通过关闭操作关闭,尽管我失去了可拖动功能....当我通过 self.layout.add_widget( 将弹出窗口直接添加到主窗口时弹出窗口),我可以移动弹出窗口,但无法关闭它......我猜 open() 调用正在重新定义可拖动窗口?这是真的?如果不是,发生了什么以及如何解决它?from kivy.app import Appfrom kivy.uix.widget import Widgetfrom kivy.uix.image import Imagefrom kivy.core.window import Windowfrom kivy.uix.behaviors import DragBehaviorfrom kivy.uix.floatlayout import FloatLayout from kivy.uix.popup import Popup class PopupExample(App): # override the build method and return the root widget of this App def build(self): # Define a grid layout for this App self.layout = FloatLayout() # Add a button self.button = Button(text ="Click for pop-up") self.layout.add_widget(self.button) # Attach a callback for the button press event self.button.bind(on_press = self.onButtonPress) return self.layout def onButtonPress(self, button): # print('opening') layout = GridLayout(cols = 1, padding = 10) img = Image(source="temp_plot.png") closeButton = Button(text = "Close the pop-up") layout.add_widget(img) layout.add_widget(closeButton) popup = MoveableImage( title ='Demo Popup', content = layout, size_hint =(None, None), size = (400,400)) popup.open() #self.layout.add_widget(popup) #closeButton.bind(on_press = self.remove_widget(popup))class MoveableImage(DragBehavior,Popup): def __init__(self, **kwargs): super(MoveableImage, self).__init__(**kwargs) self.drag_timeout = 10000000 self.drag_distance = 0 self.drag_rectangle = [self.x, self.y, self.width, self.height] def on_pos(self, *args): self.drag_rectangle = [self.x, self.y, self.width, self.height] def on_size(self, *args): self.drag_rectangle = [self.x, self.y, self.width, self.height]
1 回答
回首忆惘然
TA贡献1847条经验 获得超11个赞
如果您想拖动Popup
,将其添加到App
layout
可能是最好的方法。当然,那么你并不真的需要使用Popup
,只需使用一些Layout
。如果您走这条路,可以通过定义如下绑定Popup
来完成删除:Button
closeButton.bind(on_press = lambda x: self.layout.remove_widget(popup))
它lambda
只是用来吸收添加的按钮实例参数on_press
,因此您不会收到有关该remove_widget()
方法的参数太多的错误。
该类modalView
( 的基类Popup
)有一个保持居中的方法Popup
。DragBehavior
如果您覆盖该方法,看起来会起作用。所以,如果您添加:
def _align_center(self, *l): pass
到你的MoveableImage
班级,我想你就能拖下去了。open()
的方法进行一些ModalView
绑定以确保_align_center()
在任何位置或大小更改时调用该方法。由于将 添加Popup
到 aLayout
不会调用该open()
方法,因此永远不会设置这些绑定。
添加回答
举报
0/150
提交
取消