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

Kivy中ScreenManager调用random_screen报AttributeError的解决求助

解决Kivy中点击按钮随机跳转屏幕的AttributeError问题

错误原因

  1. 你定义的MyScreens类从未被使用,Q1/Q2/Q3直接继承自Screen而非MyScreens
  2. KV代码中调用app.root.random_screen(),但app.root是原生ScreenManager实例,该类没有random_screen方法
  3. 原random_screen方法逻辑错误:self.source是Image控件的属性,而非ScreenManager切换屏幕的正确属性

修改后的Python代码

from kivy.app import App
from kivy.uix.screenmanager import ScreenManager, Screen
from random import choice


# 自定义ScreenManager子类,集成随机切换屏幕的方法
class MyScreenManager(ScreenManager):
    screens = ["Q1", "Q2", "Q3"]

    def random_screen(self, *_):
        # 可选:排除当前屏幕,确保跳转到其他不同屏幕
        current_screen = self.current
        available_screens = [s for s in self.screens if s != current_screen]
        # 切换到随机目标屏幕
        self.current = choice(available_screens) if available_screens else current_screen


class Q1(Screen):
    pass


class Q2(Screen):
    pass


class Q3(Screen):
    pass


class TestApp(App):
    def build(self):
        sm = MyScreenManager()
        sm.add_widget(Q1(name='Q1'))
        sm.add_widget(Q2(name='Q2'))
        sm.add_widget(Q3(name='Q3'))  # 修复原代码错误:原添加了重复的Q2实例
        return sm


if __name__ == '__main__':
    TestApp().run()

修改后的KV代码

<Q1>:
    Image:
        source: 'Q1.png'

        FloatLayout:
            size: root.width, root.height/2

            Button:
                size_hint: 0.3, 0.25
                pos_hint: {"x":0.09, "top":1.16}
                background_color: 1, 1, 1, 0.2
                on_release: app.root.random_screen()

<Q2>:
    Image:
        source: 'Q2.png'

        FloatLayout:
            size: root.width, root.height/2

            Button:
                size_hint: 0.3, 0.25
                pos_hint: {"x":0.09, "top":1.16}
                background_color: 1, 1, 1, 0.2
                on_press: app.root.random_screen()

<Q3>:
    Image:
        source: 'Q3.png'

        FloatLayout:
            size: root.width, root.height/2

            Button:
                size_hint: 0.3, 0.25
                pos_hint: {"x":0.09, "top":1.16}
                background_color: 1, 1, 1, 0.2
                on_press: app.root.random_screen()

关键修改点

  1. 将random_screen方法移到自定义的MyScreenManager类中,确保app.root(即ScreenManager实例)能调用该方法
  2. 用self.current控制屏幕切换,这是ScreenManager的标准属性
  3. 修复了原代码中重复添加Q2屏幕的错误
  4. 可选添加了排除当前屏幕的逻辑,避免重复停留在同一屏幕

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 18:51:02