Python Kivy弹出和拖动行为
所以我对Kivy很陌生,到目前为止,这是相当令人沮丧的…无论如何,我现在正在尝试制作一个弹出窗口,我可以拖动和移动,我不知道发生了什么。。。。当我在onButtonPress函数中调用popup.open()时,虽然我失去了可拖动的功能,但通过Disclose操作可以关闭弹出窗口……当我通过self.layout.add_小部件(弹出窗口)将弹出窗口直接添加到主窗口时,我可以移动弹出窗口,但随后无法关闭它……我猜是open()call正在重新定义可拖动窗口?这是真的吗?如果没有,发生了什么?我如何修复它Python Kivy弹出和拖动行为,python,kivy,Python,Kivy,所以我对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()导致弹出窗口不再可拖动的原因有何想法?我已添加到我的答案中。太棒了,谢谢您,您在这方面帮了我很大的忙!