Jupyter Notebook中使用Kivy遇OSError: source code not available问题求助
解决Jupyter Notebook中Kivy组件创建的错误问题
问题场景
在Jupyter Notebook中尝试用Kivy创建带按钮的窗口,代码分为三个单元格:
- 第一个单元格导入库并配置窗口,运行正常;
- 第二个单元格定义App类并尝试用
InteractiveLauncher运行,触发错误; - 第三个单元格加载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会引发未定义错误。
错误原因
InteractiveLauncher已废弃:该类属于Kivy旧版本交互式工具,当前版本已标记废弃,且在Jupyter多线程环境中会触发源码路径获取错误;- App类实现不完整:
WindowApp未重写build方法返回布局,导致Kivy自动尝试加载同名KV文件,但Jupyter中动态定义的类无法被inspect.getfile获取源码路径,触发OSError; - 变量未初始化:
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
相关产品推荐
相关产品推荐

