如何在Kivy中移除指定的Rectangle对象?
解决Kivy中移除指定RoundedRectangle的问题
你之前用self.parent.remove_widget无效,是因为RoundedRectangle属于Canvas绘图指令,并非Widget组件,不能用移除Widget的方法操作。要单独移除它,需要先保存图形实例的引用,再从Canvas的指令列表中删除。
修改步骤
- 在
Screen1类中添加属性,用于存储要移除的RoundedRectangle实例 - 创建图形时将实例赋值给该属性,方便后续定位
- 删除时从Canvas中移除该实例,并清空引用
- 修复kv文件中移除按钮的调用错误(原代码少了方法调用的括号)
修改后的完整代码
.py文件
import kivy kivy.require("1.10.1") from kivy.uix.screenmanager import ScreenManager, Screen, FadeTransition from kivy.lang import Builder from kivy.app import App from kivy.graphics import RoundedRectangle class Screen1(Screen): def __init__(self, **kwargs): super().__init__(**kwargs) self.my_rect = None # 存储目标图形的引用 def create_on_press(self): # 避免重复创建相同图形 if not self.my_rect: with self.canvas: self.my_rect = RoundedRectangle( pos=(770, 1250), size=(400, 400), source="Rectangle.jpeg" ) def remove_on_press(self): if self.my_rect: self.canvas.remove(self.my_rect) # 从Canvas中移除指定图形 self.my_rect = None # 清空引用,允许后续重新创建 class Test(App): def build(self): Builder.load_file("Test.kv") sm = ScreenManager(transition=FadeTransition()) sm.add_widget(Screen1(name="scr1")) return sm Test().run()
.kv文件
#: kivy 1.10.1 <Screen1>: id: scr1 canvas.before: Rectangle: pos: self.pos size: self.size source: "Background.png" Button: pos: (root.width - 600) / 2, 800 size: 600, 200 text: "Create rectangle" on_press: scr1.create_on_press() pos_hint: {'width': 0.5, 'top': 0.8} size_hint: None, None Button: pos: (root.width - 600) / 2, 200 size: 600, 200 text: "Remove rectangle" on_press: scr1.remove_on_press() # 修复:添加方法调用的括号 pos_hint: {'width': 0.5, 'top': 0.2} size_hint: None, None
关键说明
self.canvas是绘图指令的集合,调用remove()方法可精准移除指定的指令实例- 保存
self.my_rect引用是为了避免误删Canvas中的其他绘图指令 - 添加重复创建判断,防止多次点击生成多个图形导致无法全部移除
内容的提问来源于stack exchange,提问作者aturt13
相关产品推荐
相关产品推荐

