如何为 python kivy 绘画应用程序添加清除按钮
How to add a clear button for a python kivy painting app
我正在使用 python 和 kivy 构建一个基本的绘画应用程序,用于学习应用程序开发。我想弄清楚如何通过修改 .kv 文件上的代码在屏幕上绘制后清除 canvas。
在 .kv 文件中,我想我需要修改 #on_release:root.canvas.clear()
代码的一部分,目前它删除了整个 canvas 和按钮。我正在想办法让它只清除屏幕,允许再次在屏幕上重绘,并且不会擦除按钮。
这是一张上下文图片
Painter App
按下清除按钮后会发生什么
Blank Screen
from random import random
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen, FadeTransition
from kivy.uix.widget import Widget
from kivy.graphics import Line, Color, Ellipse
class Painter(Widget):
def on_touch_down(self, touch):
color = (random(), 1.,1.) #reduce number of possible colors
with self.canvas:
Color(*color, mode='hsv') #sets the colors to be equally bright
d = 30.
Ellipse(pos=(touch.x - d / 2,touch.y - d / 2), size=(d,d))
touch.ud["line"] = Line(points=(touch.x, touch.y))
def on_touch_move(self, touch):
touch.ud["line"].points += [touch.x, touch.y]
class MainScreen(Screen):
pass
class AnotherScreen(Screen):
pass
class ScreenManagement(ScreenManager):
pass
presentation = Builder.load_file("main3.kv") #load the kivy file
class SimpleKivy7(App):
def build(self):
return presentation
if __name__== "__main__":
SimpleKivy7().run()
以下是kivy文件
#: import FadeTransition kivy.uix.screenmanager.FadeTransition
ScreenManagement:
transition: FadeTransition()
MainScreen:
AnotherScreen:
<MainScreen>:
name: "main"
Button:
on_release: app.root.current = "other"
text: "Next Screen"
font_size: 50
<AnotherScreen>:
name: "other"
FloatLayout:
Painter
Button:
color:0,1,0,1
font_size: 25
size_hint: 0.3, 0.2
text: "Back Home"
on_release: app.root.current = "main"
pos_hint: {"right":1, "top":1}
Button:
color:0,1,0,1
font_size: 25
size_hint: 0.3, 0.2
text: "Clear"
#on_release:root.canvas.clear() #root.canvas.clear() clears everything.
pos_hint: {"left":1, "top":1}
我假设您提供的代码只是您代码库的一部分。我遇到了一些我想清除的错误:Painter
def on_touch_down
之后的第 10 行没有缩进,我在第 10-17 行缩进了一次。在 .kv
文件中有两个小部件 kivy 被认为是根小部件(只能有一个)。我在第 3 行的屏幕管理器 ScreenManagement
周围添加了 <
和 >
。我也很遗憾地说,在我的情况下,应用程序只绘制圆圈,而不绘制圆圈之后的线条。
问题出在 .kv
文件的第 34 行:on_release: root.canvas.clear()
。 root
指的是 FloatLayout
。因此,您要清除 FloatLayout
上的所有内容,包括按钮。您需要清除的是 Painter
小部件的 canvas。将 id
添加到您的 Painter
并清除其 canvas:
FloatLayout:
Painter:
id: painter # an id for referring to this widget
Button:
color:0,1,0,1
font_size: 25
size_hint: 0.3, 0.2
text: "Back Home"
on_release: app.root.current = "main"
pos_hint: {"right":1, "top":1}
Button:
color:0,1,0,1
font_size: 25
size_hint: 0.3, 0.2
text: "Clear"
on_release: painter.canvas.clear() # clear the Painter's canvas
pos_hint: {"left":1, "top":1}
我正在使用 python 和 kivy 构建一个基本的绘画应用程序,用于学习应用程序开发。我想弄清楚如何通过修改 .kv 文件上的代码在屏幕上绘制后清除 canvas。
在 .kv 文件中,我想我需要修改 #on_release:root.canvas.clear() 代码的一部分,目前它删除了整个 canvas 和按钮。我正在想办法让它只清除屏幕,允许再次在屏幕上重绘,并且不会擦除按钮。
这是一张上下文图片 Painter App
按下清除按钮后会发生什么 Blank Screen
from random import random
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen, FadeTransition
from kivy.uix.widget import Widget
from kivy.graphics import Line, Color, Ellipse
class Painter(Widget):
def on_touch_down(self, touch):
color = (random(), 1.,1.) #reduce number of possible colors
with self.canvas:
Color(*color, mode='hsv') #sets the colors to be equally bright
d = 30.
Ellipse(pos=(touch.x - d / 2,touch.y - d / 2), size=(d,d))
touch.ud["line"] = Line(points=(touch.x, touch.y))
def on_touch_move(self, touch):
touch.ud["line"].points += [touch.x, touch.y]
class MainScreen(Screen):
pass
class AnotherScreen(Screen):
pass
class ScreenManagement(ScreenManager):
pass
presentation = Builder.load_file("main3.kv") #load the kivy file
class SimpleKivy7(App):
def build(self):
return presentation
if __name__== "__main__":
SimpleKivy7().run()
以下是kivy文件
#: import FadeTransition kivy.uix.screenmanager.FadeTransition
ScreenManagement:
transition: FadeTransition()
MainScreen:
AnotherScreen:
<MainScreen>:
name: "main"
Button:
on_release: app.root.current = "other"
text: "Next Screen"
font_size: 50
<AnotherScreen>:
name: "other"
FloatLayout:
Painter
Button:
color:0,1,0,1
font_size: 25
size_hint: 0.3, 0.2
text: "Back Home"
on_release: app.root.current = "main"
pos_hint: {"right":1, "top":1}
Button:
color:0,1,0,1
font_size: 25
size_hint: 0.3, 0.2
text: "Clear"
#on_release:root.canvas.clear() #root.canvas.clear() clears everything.
pos_hint: {"left":1, "top":1}
我假设您提供的代码只是您代码库的一部分。我遇到了一些我想清除的错误:Painter
def on_touch_down
之后的第 10 行没有缩进,我在第 10-17 行缩进了一次。在 .kv
文件中有两个小部件 kivy 被认为是根小部件(只能有一个)。我在第 3 行的屏幕管理器 ScreenManagement
周围添加了 <
和 >
。我也很遗憾地说,在我的情况下,应用程序只绘制圆圈,而不绘制圆圈之后的线条。
问题出在 .kv
文件的第 34 行:on_release: root.canvas.clear()
。 root
指的是 FloatLayout
。因此,您要清除 FloatLayout
上的所有内容,包括按钮。您需要清除的是 Painter
小部件的 canvas。将 id
添加到您的 Painter
并清除其 canvas:
FloatLayout:
Painter:
id: painter # an id for referring to this widget
Button:
color:0,1,0,1
font_size: 25
size_hint: 0.3, 0.2
text: "Back Home"
on_release: app.root.current = "main"
pos_hint: {"right":1, "top":1}
Button:
color:0,1,0,1
font_size: 25
size_hint: 0.3, 0.2
text: "Clear"
on_release: painter.canvas.clear() # clear the Painter's canvas
pos_hint: {"left":1, "top":1}