提问者:小点点

Kivy使用画布:在开始超越边界时与线发生关键错误


我正在用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

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

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

[INFO][Base]正在退出应用程序。。。回溯(最近一次调用):MainApp()中的文件“/home/igor/PycharmProjects/kivytest/kivytest.py”,第46行。runTouchApp事件循环中的第504行,运行()文件“/home/igor/PycharmProjects/kivytest/venv/lib/python3.6/site packages/kivy/app.py”,第855行,runTouchApp()文件“/home/igor/PycharmProjects/kivytest/venv/lib/python3.6/site packages/kivy/base.py”。窗mainloop()文件“/home/igor/PycharmProjects/kivytest/venv/lib/python3.6/site packages/kivy/core/window/window_sdl2.py”,第747行,在mainloop self中_mainloop()文件“/home/igor/PycharmProjects/kivytest/venv/lib/python3.6/site packages/kivy/core/window/window_sdl2.py”,第479行,在mainloop事件循环中。idle()文件“/home/igor/PycharmProjects/kivytest/venv/lib/python3.6/site packages/kivy/base.py”,idle self中的第342行。发送输入()文件“/home/igor/PycharmProjects/kivytest/venv/lib/python3.6/site packages/kivy/base.py”,第327行,发送输入后发送输入(*pop(0))文件“/home/igor/PycharmProjects/kivytest/venv/lib/python3.6/site packages/kivy/base.py”,第233行,发送后输入侦听器。发送('on_motion',etype,me)文件“kivy/_event.pyx”,第707行,在kivy中_事件事件调度员。发送文件“/home/igor/PycharmProjects/kivytest/venv/lib/python3.6/site packages/kivy/core/window/init.py”,第1404行,动态自启动。发送('on_touch_move',me)文件“kivy/_event.pyx”,第707行,在kivy中_事件事件调度员。调度文件“/home/igor/PycharmProjects/kivytest/venv/lib/python3.6/site packages/kivy/core/window/init.py”,第1430行,如果w.dispatch('on_touch_move',touch'),在kivy的第707行,文件“kivy/_event.pyx”_事件事件调度员。调度文件“/home/igor/PycharmProjects/kivytest/venv/lib/python3.6/site packages/kivy/uix/widget.py”,第560行,如果是孩子,请在触摸屏上移动。调度('on_touch_move',touch):文件“kivy/_event.pyx”,第707行,在kivy中_事件事件调度员。发送文件“/home/igor/PycharmProjects/kivytest/kivytest.py”,第30行,在on_touch_move touch中。ud['line']。points=[touch.x,touch.y]键错误:“line”

谢谢帮忙: D


共1个答案

匿名用户

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

最终,您应该将其编码为您想要做的任何事情(例如,当触摸移动到您的边界时,您可能想要启动线路),但最简单的修复方法是检查触摸是否touch。ud['line']在尝试执行任何操作之前存在。

相关问题