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

Kivy中remove_widget使用问题求助:按钮无法移除

解决Kivy中remove_widget移除按钮无效的问题

问题根源

  • next2方法错误调用super().__init__(**kwargs):该方法是按钮点击回调,并非类构造函数,调用父类初始化会重置Screen实例,完全多余。
  • 按钮父控件定位错误:btn2是添加到main_line这个BoxLayout中的,而非直接添加到FirstScr,因此不能直接通过self.remove_widget(self.btn2)移除,必须从它的直接父容器操作。
  • main_line是局部变量:初始化时的main_line仅存在于__init__方法内,后续方法无法访问,需改为实例属性。

修正后的代码

from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.label import Label
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.uix.textinput import TextInput
from kivy.lang import Builder

class FirstScr(Screen):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        # 将main_line改为实例属性,供后续方法访问
        self.main_line = BoxLayout(orientation = 'vertical', padding=8, spacing=8)
        go = Label(text='Нажми на нужную кнопку!', halign='center')
        self.btn = Button(text='Жми!', size_hint=(.3,.2), pos_hint={'center_x':.5})
        self.btn2 = Button(text='Не жми сюда!', size_hint=(.3,.2), pos_hint={'center_x':.5})

        self.main_line.add_widget(go)
        self.main_line.add_widget(self.btn)
        self.main_line.add_widget(self.btn2)

        self.add_widget(self.main_line)

        self.btn.on_press = self.next
        self.btn2.on_press = self.next2
    
    def next(self):
        # 替换原有布局:先移除旧布局再添加新布局,避免重叠
        self.remove_widget(self.main_line)
        new_main_line = BoxLayout(orientation = 'vertical', padding=8, spacing=8)
        go2 = Label(text='Молодец!')
        new_main_line.add_widget(go2)
        self.add_widget(new_main_line)
    
    def next2(self):
        # 从按钮的直接父容器中移除btn2
        self.main_line.remove_widget(self.btn2)

class MyApp(App):
    def build(self):
        sm = ScreenManager()
        sm.add_widget(FirstScr(name='first'))
        return sm

MyApp().run()

关键修改说明

  1. 把main_line改为self.main_line:让后续方法能直接访问这个容器控件。
  2. 删除next2中的super().__init__(**kwargs):回调方法无需初始化父类,这行代码会破坏现有实例状态。
  3. 调整移除逻辑:调用self.main_line.remove_widget(self.btn2),从按钮的直接父容器中移除,这才是正确的操作方式。
  4. 优化next方法:替换界面时先移除旧布局,避免多个布局重叠显示。

内容的提问来源于stack exchange,提问作者Programmer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 20:35:14