Kivy:滚动缩放

时间:2018-04-12 23:03:38

标签: python kivy kivy-language

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

我在我的kivy应用程序中开始使用静态图像。我想添加缩放/平移到图像的功能。我不希望更改图像框架的实际尺寸,只需添加缩放/平移功能,就像您可能期望与谷歌地图进行交互一样。

可能的编程方向

根据我的阅读,我应该使用Scatter(?),我发现我可以手动设置Scatter比例来调整图像的大小。

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

问题

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

  • 有更直接的方式吗?

有没有办法在我的kv文件中使用on_motion类型事件来使用鼠标滚轮调整此值?

我给出了一个关于我的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()

#: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'

产地: screenshot

有点相关:

2 个答案:

答案 0 :(得分:4)

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

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

next_friday=04MAY2018 following_friday=11MAY2018

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

demo of zooming and panning

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

答案 1 :(得分:1)

@mdoc-2011 的 other answer 有一个问题,它没有锚定在鼠标指针上,这意味着使用起来很烦人,因为内容会滚动很多。这可以通过不使用 .scale 属性而是直接调用 apply_transform 来解决:

if touch.is_mouse_scrolling:
    factor = None
    if touch.button == 'scrolldown':
        if self.scale < self.scale_max:
            factor = 1.1
    elif touch.button == 'scrollup':
        if self.scale > self.scale_min:
            factor = 1 / 1.1
    if factor is not None:
        self.apply_transform(Matrix().scale(factor, factor, factor),
                             anchor=touch.pos)

此版本还使用.scale_(min/max) 属性,而不是1.10.8 使用1/1.1,这将使滚动滚动更直观。

相关问题