Kivy中的可拖动图像

2024-10-03 06:30:26 发布

您现在位置:Python中文网/ 问答频道 /正文

所以我对Kivy和Gui编码一般都是新手。。。。我正在尝试创建一个可移动图像,以下是我迄今为止尝试过的代码:

from kivy.app import App
from kivy.uix.widget import Widget
from kivy.uix.image import Image
from kivy.uix.behaviors import DragBehavior
from kivy.uix.floatlayout import FloatLayout 

class Box_layout(FloatLayout):
    def __init__(self,**kwargs):
        super(Box_layout, self).__init__(**kwargs)
        self.size_hint = (.50,.50)
        self.orientation = "vertical"
        self.add_widget(MoveableImage())#drag_rectangle = [self.x, self.y, self.width, self.height],source="temp_plot.png"))


class MoveableImage(DragBehavior,Image):

    def __init__(self, **kwargs):
        super(MoveableImage, self).__init__(**kwargs)
        self.drag_timeout = 10000000
        self.drag_distance = 0
        #self.drag = DragBehavior()
        #self.drag.drag_rectangle = [self.x, self.y, self.width, self.height]

        
class gameApp(App):
    def build(self):
        wimg = MoveableImage(source="temp_plot.png")
        m = Box_layout()



if __name__ == '__main__':
    gameApp().run()

发生的情况是,我当前有一个空白的“图像”,在第一次单击时可以拖动,但在移动一次后,它会达到超时或无法移动的状态。。。。。我认为这是一个超时问题或其他问题,尽管self.drag_timeout = 10000000没有解决这个问题……我在这里做错了什么? 此外,当我将一个实际的源传递给MoveableImage时,即self.add_widget(MoveableImage(source='tmp.png')),图像一开始就不可移动,这对我来说再次是非常困惑的……如果有人能帮助解释发生了什么,然后解释为什么会发生这些行为,那就太棒了


Tags: from图像importselfboxinitwidgetkwargs
1条回答
网友
1楼 · 发布于 2024-10-03 06:30:26

您还需要更新MoveableImagedrag_rectangle。最简单的方法是使用kv语言。因此MoveableImage类可以简单地:

class MoveableImage(DragBehavior, Image):
    pass

然后像这样加载kv规则:

kv = '''
<MoveableImage>:
    # Define the properties for the MoveableImage
    drag_rectangle: self.x, self.y, self.width, self.height
    drag_timeout: 10000000
    drag_distance: 0
'''
Builder.load_string(kv)

这里使用kv的优点是它会自动设置绑定,否则您必须自己编写绑定。drag_rectangle就是一个例子,因此当移动MoveableImage时,drag_rectangle会自动更新

如果您想自己设置这些绑定(而不是使用kv),您可以将MoveableImage定义为:

class MoveableImage(DragBehavior, Image):

    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]

相关问题 更多 >