Kivy 使用 Canvas:越界开始时出现关键线错误

Posted

技术标签:

【中文标题】Kivy 使用 Canvas:越界开始时出现关键线错误【英文标题】:Kivy using Canvas: Key error with line while starting beyond boundaries 【发布时间】:2020-11-13 13:15:25 【问题描述】:

我正在使用 Kivy 创建简单的绘图应用程序。我正在通过这段代码实现绘图:

class Paint(Widget):

    def on_touch_down(self, touch):
        color = (random(), 1, 1)
        with self.canvas:
            Color(*color, mode='hsv')
            d = 10.
            if touch.y > self.height:
                Ellipse(pos=(touch.x - d / 2, touch.y - d / 2), size=(d, d))
                touch.ud['line'] = Line(points=[touch.x, touch.y], width=5)
            else:
                pass

    def on_touch_move(self, touch):
        if touch.y > self.height:
            touch.ud['line'].points += [touch.x, touch.y]
        else:
            pass

“if”语句用于忽略超出我的绘图区域但仍在应用程序窗口中的触摸输入。 当我开始在正确的区域绘图时,即使我超出了界限,一切都可以正常工作。

当我开始在该区域外绘制并进入该区域时发生错误。 这些是我得到的日志:

[INFO ] [Base ] 正在退出应用程序... 回溯(最近一次通话最后): 文件“/home/igor/PycharmProjects/kivytest/kivytest.py”,第 46 行,在 MainApp().run() 文件“/home/igor/PycharmProjects/kivytest/venv/lib/python3.6/site-packages/kivy/app.py”, 第 855 行,运行中 运行触摸应用程序() 文件“/home/igor/PycharmProjects/kivytest/venv/lib/python3.6/site-packages/kivy/base.py”, 第 504 行,在 runTouchApp 中 EventLoop.window.mainloop() 文件“/home/igor/PycharmProjects/kivytest/venv/lib/python3.6/site-packages/kivy/core/window/window_sdl2.py”, 第 747 行,在主循环中 self._mainloop() 文件“/home/igor/PycharmProjects/kivytest/venv/lib/python3.6/site-packages/kivy/core/window/window_sdl2.py”, 第 479 行,在 _mainloop EventLoop.idle() 文件“/home/igor/PycharmProjects/kivytest/venv/lib/python3.6/site-packages/kivy/base.py”, 第 342 行,空闲 self.dispatch_input() 文件“/home/igor/PycharmProjects/kivytest/venv/lib/python3.6/site-packages/kivy/base.py”, 第 327 行,在 dispatch_input 中 post_dispatch_input(*pop(0)) 文件“/home/igor/PycharmProjects/kivytest/venv/lib/python3.6/site-packages/kivy/base.py”, 第 233 行,在 post_dispatch_input listener.dispatch('on_motion', etype, 我) 文件“kivy/_event.pyx”,第 707 行,在 kivy._event.EventDispatcher.dispatch 文件“/home/igor/PycharmProjects/kivytest/venv/lib/python3.6/site-packages/kivy/core/window/init.py”, 第 1404 行,在 on_motion self.dispatch('on_touch_move', 我) 文件“kivy/_event.pyx”,第 707 行,在 kivy._event.EventDispatcher.dispatch 文件“/home/igor/PycharmProjects/kivytest/venv/lib/python3.6/site-packages/kivy/core/window/init.py”, 第 1430 行,在 on_touch_move 如果 w.dispatch('on_touch_move', touch): 文件“kivy/_event.pyx”,第 707 行,在 kivy._event.EventDispatcher.dispatch 文件“/home/igor/PycharmProjects/kivytest/venv/lib/python3.6/site-packages/kivy/uix/widget.py”, 第 560 行,在 on_touch_move if child.dispatch('on_touch_move', touch): 文件“kivy/_event.pyx”,第 707 行,在 kivy._event.EventDispatcher.dispatch 文件“/home/igor/PycharmProjects/kivytest/kivytest.py”,第 30 行,在 on_touch_move touch.ud['line'].points += [touch.x, touch.y] 键错误:'行'

感谢您的帮助:D

【问题讨论】:

【参考方案1】:

错误正是它所说的:在触摸开始于小部件边界之外的情况下,您没有将touch.ud['line'] 设置为任何内容,因此当您稍后尝试访问它时该键不存在。

最终你应该编码它来做任何你想做的事情(例如你可能想在触摸移动到你的边界时开始行),但最直接的解决方法是在尝试做之前检查touch.ud['line']是否存在任何东西。

【讨论】:

以上是关于Kivy 使用 Canvas:越界开始时出现关键线错误的主要内容,如果未能解决你的问题,请参考以下文章

使用 python kivy 构建应用程序时出现错误

读取 xml 时出现地址越界错误

尝试使用 kivy 制作的 buildozer 打包简单的计算器应用程序时出现错误“adb:安装失败”

尝试在 kivy 上制作圆形按钮时出现问题

在 PyCharm 上导入 Kivy 时出现错误“[Core] 选项 --mode 无法识别”

QT+PCL程序调试时出现指针越界的错误,如图