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:越界开始时出现关键线错误的主要内容,如果未能解决你的问题,请参考以下文章
尝试使用 kivy 制作的 buildozer 打包简单的计算器应用程序时出现错误“adb:安装失败”