You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Kivy中移除指定的Rectangle对象?

解决Kivy中移除指定RoundedRectangle的问题

你之前用self.parent.remove_widget无效,是因为RoundedRectangle属于Canvas绘图指令,并非Widget组件,不能用移除Widget的方法操作。要单独移除它,需要先保存图形实例的引用,再从Canvas的指令列表中删除。

修改步骤

  1. 在Screen1类中添加属性,用于存储要移除的RoundedRectangle实例
  2. 创建图形时将实例赋值给该属性,方便后续定位
  3. 删除时从Canvas中移除该实例,并清空引用
  4. 修复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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 17:35:22