停止弹出和拖动行为

所以我对 Kivy 很陌生,到目前为止非常令人沮丧......无论如何,我现在正在尝试制作一个可以拖动和移动的弹出窗口,但我不明白发生了什么...... ..当我在 onButtonPress 函数中调用 popup.open() 时,弹出窗口可以通过关闭操作关闭,尽管我失去了可拖动功能....当我通过 self.layout.add_widget( 将弹出窗口直接添加到主窗口时弹出窗口),我可以移动弹出窗口,但无法关闭它......我猜 open() 调用正在重新定义可拖动窗口?这是真的?如果不是,发生了什么以及如何解决它?

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]




四季花海
浏览 116回答 1
1回答

回首忆惘然

如果您想拖动Popup,将其添加到App layout可能是最好的方法。当然,那么你并不真的需要使用Popup,只需使用一些Layout。如果您走这条路,可以通过定义如下绑定Popup来完成删除:ButtoncloseButton.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()方法,因此永远不会设置这些绑定。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python