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

Jupyter Notebook中使用Kivy遇OSError: source code not available问题求助

解决Jupyter Notebook中Kivy组件创建的错误问题

问题场景

在Jupyter Notebook中尝试用Kivy创建带按钮的窗口,代码分为三个单元格:

  1. 第一个单元格导入库并配置窗口,运行正常;
  2. 第二个单元格定义App类并尝试用InteractiveLauncher运行,触发错误;
  3. 第三个单元格加载KV代码并添加组件,导致窗口崩溃。

原第二个单元格代码

from kivy.app import App
from kivy.uix.button import Button
from kivy.interactive import InteractiveLauncher
from kivy.lang import Builder

# 强制禁用全屏
from kivy.config import Config
Config.set("graphics", "fullscreen", "0")

janela = None
glayout= None
...
class WindowApp(App):
    pass

window = WindowApp()
wi = InteractiveLauncher(janela)
wi.run()

触发的错误信息

[WARNING] [Deprecated  ] Call to deprecated function __init__ in /home/alfred/anaconda3/envs/k39/lib/python3.10/site-packages/kivy/interactive.py line 308.Called from /tmp/ipykernel_5673/4179568724.py line 5 by <module>().
 Exception in thread Thread-5 (startApp):
 Traceback (most recent call last):
File "/home/alfred/anaconda3/envs/k39/lib/python3.10/threading.py", line 1009, in _bootstrap_inner
     self.run()
   File "/home/alfred/anaconda3/envs/k39/lib/python3.10/threading.py", line 946, in run
     self._target(*self._args, **self._kwargs)
   File "/home/alfred/anaconda3/envs/k39/lib/python3.10/site-packages/kivy/interactive.py", line 319, in startApp
     app.run(*args, **kwargs)
   File "/home/alfred/anaconda3/envs/k39/lib/python3.10/site-packages/kivy/app.py", line 954, in run
     self._run_prepare()
   File "/home/alfred/anaconda3/envs/k39/lib/python3.10/site-packages/kivy/app.py", line 923, in _run_prepare
     self.load_kv(filename=self.kv_file)
   File "/home/alfred/anaconda3/envs/k39/lib/python3.10/site-packages/kivy/app.py", line 676, in load_kv
     default_kv_directory = dirname(getfile(self.__class__))
   File "/home/alfred/anaconda3/envs/k39/lib/python3.10/inspect.py", line 785, in getfile
     raise OSError('source code not available')
 OSError: source code not available

第三个单元格代码及问题

kvcode= """FloatLayout:
    Button:
        size_hint: .1, .1
        pos_hint: {"x":.3, "top": 1.}
        text: "A"
"""
glayout= Builder.load_string(kvcode)
janela.root_window.add_widget(glayout)

运行后出现崩溃的黑窗口,因为janela变量为None,调用root_window会引发未定义错误。

错误原因

  1. InteractiveLauncher已废弃:该类属于Kivy旧版本交互式工具,当前版本已标记废弃,且在Jupyter多线程环境中会触发源码路径获取错误;
  2. App类实现不完整:WindowApp未重写build方法返回布局,导致Kivy自动尝试加载同名KV文件,但Jupyter中动态定义的类无法被inspect.getfile获取源码路径,触发OSError;
  3. 变量未初始化:janela被赋值为None,后续调用janela.root_window会引发属性错误,导致窗口崩溃。

修正方案

方案1:使用runTouchApp(Jupyter环境推荐)

直接加载KV布局并通过runTouchApp运行,无需定义App类,适配交互式环境:

单元格1:导入库并配置

from kivy.lang import Builder
from kivy.config import Config
from kivy.base import runTouchApp

# 强制禁用全屏
Config.set("graphics", "fullscreen", "0")

单元格2:加载布局并运行

kvcode = """
FloatLayout:
    Button:
        size_hint: .1, .1
        pos_hint: {"x": .3, "top": 1.}
        text: "A"
"""

# 加载KV代码并启动窗口
root_layout = Builder.load_string(kvcode)
runTouchApp(root_layout)

方案2:正确实现App类

重写build方法返回布局,避免自动加载KV文件的逻辑:

单元格1:导入库并配置

from kivy.app import App
from kivy.lang import Builder
from kivy.config import Config

Config.set("graphics", "fullscreen", "0")

单元格2:定义App并运行

kvcode = """
FloatLayout:
    Button:
        size_hint: .1, .1
        pos_hint: {"x": .3, "top": 1.}
        text: "A"
"""

class WindowApp(App):
    def build(self):
        # 直接返回加载的布局,跳过自动KV加载流程
        return Builder.load_string(kvcode)

# 在Jupyter中运行App
WindowApp().run()

注意事项

  • Jupyter中运行Kivy窗口后,关闭窗口可能需要重启内核才能再次运行,避免残留图形上下文冲突;
  • 彻底弃用已废弃的InteractiveLauncher,改用官方推荐的runTouchApp或标准App运行方式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 01:00:59