Kivy:滚动缩放

mdo*_*011 4 python kivy kivy-language

有没有办法放大桌面kivy应用程序上的图像(例如,用鼠标滚轮缩放)?它似乎在这里讨论:https : //github.com/kivy/kivy/issues/3563但我看不出有没有解决的办法。

我从我的kivy应用程序中开始使用静态图像。我想添加缩放/平移图像的功能。我不希望图像框的实际大小发生变化,仅添加缩放/平移功能即可,例如,您可能希望与Google地图进行交互。

可能的编程方向

从我所读的内容中,我应该使用Scatter(?),并且看到可以手动设置Scatter比例来放大/缩小图像。

我最初的想法是,我将不得不添加一个单独的带有滚动视图的小部件以包含分散的布局,并使图像框架保持一致的大小。然后,我需要添加一个可动态更改比例值的事件。

问题所在

  • 我找不到合适的事件来更改比例值。这次on_motion活动看起来很有希望。我的应用程序可以使用滑块更新值,但是当我尝试使用类似的方法时on_motion,AttributeError: motion出错
  • 我正在努力创建小部件。大多数文档似乎都.add_widget(...)在python文件中使用。是否可以从kv文件中执行此操作?我想象这个过程类似于屏幕和屏幕管理器,但是我正在努力寻找一种可行的方法。

  • 有没有更直接的方法可以做到这一点?

有没有一种方法可以on_motion在我的kv文件中使用type事件来使用鼠标滚轮调整此值?

我给出了一个简单的示例,展示了我的kivy应用程序的结构-以及我尝试添加Scatter所做的事情。我想我需要将其放入自己的小部件中,以保持图像大小相同?

玩具实例

import kivy
from kivy.lang import Builder
from kivy.core.window import Window


kivy.require('1.1.0')

from kivy.app import App

presentation = Builder.load_file("scatter.kv")
class TestApp(App):
    def build(self):
        Window.clearcolor = (1, 1, 1, 1)
        return presentation

    # def foo():
    #    print("You've reached foo")    

if __name__ == '__main__':
    TestApp().run()
Run Code Online (Sandbox Code Playgroud)

#:kivy 1.10.0
GridLayout:
    cols: 2

    Scatter:
        scale: 5
        # on_motion: root.foo()
        Image :
            source: 'foo.png'
            allow_stretch: True
            keep_ratio: True

    Button:
        text: 'Hello World'
Run Code Online (Sandbox Code Playgroud)

产生: 屏幕截图

相关种类:

mdo*_*011 6

为了实现我的目标,我结合了ikolim指出的在kivy python3 detect mousewheel中的信息以及此处给出的代码的组合:https : //github.com/kivy/kivy/wiki/Draggable-Scalable-Button

为了使我的回答简短,重要的代码归结为:

    if touch.is_mouse_scrolling:
        if touch.button == 'scrolldown':
            print('down')
            ## zoom in
            if self.scale < 10:
                self.scale = self.scale * 1.1

        elif touch.button == 'scrollup':
            ## zoom out
            print('up')
            if self.scale > 1:
                self.scale = self.scale * 0.8
Run Code Online (Sandbox Code Playgroud)

布局略有不同,并且我更改了按钮上的文本,但是可以在以下gif中看到我的代码的功能:

缩放和平移演示

对于任何希望看到我的整个玩具项目以适应自己目的的人,整个代码都在我的github上:https : //github.com/melissadale/Learning-Kivy/tree/master/ZoomPanning