Python Kivy弹出和拖动行为

Python Kivy弹出和拖动行为,python,kivy,Python,Kivy,所以我对Kivy很陌生,到目前为止,这是相当令人沮丧的…无论如何,我现在正在尝试制作一个弹出窗口,我可以拖动和移动,我不知道发生了什么。。。。当我在onButtonPress函数中调用popup.open()时,虽然我失去了可拖动的功能,但通过Disclose操作可以关闭弹出窗口……当我通过self.layout.add_小部件(弹出窗口)将弹出窗口直接添加到主窗口时,我可以移动弹出窗口,但随后无法关闭它……我猜是open()call正在重新定义可拖动窗口?这是真的吗?如果没有,发生了什么?我如

所以我对Kivy很陌生,到目前为止,这是相当令人沮丧的…无论如何,我现在正在尝试制作一个弹出窗口,我可以拖动和移动,我不知道发生了什么。。。。当我在onButtonPress函数中调用popup.open()时,虽然我失去了可拖动的功能,但通过Disclose操作可以关闭弹出窗口……当我通过self.layout.add_小部件(弹出窗口)将弹出窗口直接添加到主窗口时,我可以移动弹出窗口,但随后无法关闭它……我猜是open()call正在重新定义可拖动窗口?这是真的吗?如果没有,发生了什么?我如何修复它

from kivy.app import App
from kivy.uix.widget import Widget
from kivy.uix.image import Image
from kivy.core.window import Window
from kivy.uix.behaviors import DragBehavior
from 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]

        

  
# Run the app 
if __name__ == '__main__': 
    PopupExample().run() 

如果要拖动
弹出窗口
,将其添加到
应用程序
布局
可能是最好的方法。当然,您不需要使用
弹出窗口
,只需使用一些
布局
。如果您选择该路径,可以通过如下方式定义
按钮
绑定来删除
弹出窗口

closeButton.bind(on_press = lambda x: self.layout.remove_widget(popup))
lambda
只是用来吸收按钮实例arg,按下按钮时
会添加该arg,这样您就不会因为
remove\u widget()方法的参数太多而出错

modalView
类(弹出窗口的基础)有一个方法可以使弹出窗口居中。如果您过度使用该方法,看起来
DragBehavior
将起作用。因此,如果您添加:

def _align_center(self, *l):
    pass

到您的
MoveableImage
类中,我想您将能够拖动它。
ModalView
open()
方法执行一些绑定,以确保在任何位置或大小更改时调用
\u align\u center()
方法。由于将
弹出窗口
添加到
布局
不会调用
open()
方法,因此这些绑定从未设置过。

非常感谢!我尝试了self.layout.remove_小部件(popup)并得到了您提到的一个错误…您对popup.open()导致弹出窗口不再可拖动的原因有何想法?我已添加到我的答案中。太棒了,谢谢您,您在这方面帮了我很大的忙!