python-3.x - 我想在我的 tkinter 窗口中嵌入 python 控制台。我该怎么做?
问题描述
我正在制作一个文本编辑器,并想在我的应用程序中添加一个 IDLE 功能。所以我想要一个嵌入了 python IDLE 的框架,其中包含原始 python IDLE 提供的所有菜单和功能。
我查看了空闲库的来源,但找不到解决方案。
try:
import idlelib.pyshell
except ImportError:
# IDLE is not installed, but maybe pyshell is on sys.path:
from . import pyshell
import os
idledir = os.path.dirname(os.path.abspath(pyshell.__file__))
if idledir != os.getcwd():
# We're not in the IDLE directory, help the subprocess find run.py
pypath = os.environ.get('PYTHONPATH', '')
if pypath:
os.environ['PYTHONPATH'] = pypath + ':' + idledir
else:
os.environ['PYTHONPATH'] = idledir
pyshell.main()
else:
idlelib.pyshell.main()
此代码是在所有 python 安装中的 idlelib 文件夹下找到的 pyshell.pyw
我搜索了 idle.pyw,发现它使用了一个真正的 shell 程序 pyshell。那么我该如何嵌入它。
我想要一个嵌入了 python IDLE shell 的 Tkinter 框架。请给出代码。提前致谢。
解决方案
Stackoverflow 不是代码编写服务。相反,目的是帮助您编写代码。通常最好在提出问题之前编写一些代码,但在这种情况下,您在编码之前就被卡住了。
idlelib 实现 IDLE。虽然您可以自由使用它,但它是私有的,因为代码和接口可以在任何版本中更改,而没有通常的向后兼容性限制。随意导入和使用 idlelib 模块。
目前,Shell 窗口是具有菜单和框架的顶层。后者有一个文本和垂直滚动条。无法在框架内(或另一个 Toplevel 或 root = Tk())可视地嵌入 Toplevel。 top = Toplevel(myframe)
有效,但top
不能在place
d、pack
ed 或grid
ded 内myframe
。
我希望将来重构 editor.py 和 pyshell.py 以便将带有菜单的窗口与带有可滚动文本的框架分开。结果应包括parent
作为参数的可嵌入 EditorFrame 和 ShellFrame 类。但那是在未来。
目前,可以在 python 中使用import idlelib.idle
. 但是,因为它运行 mainloop()(在它自己的根上),所以它会阻塞并且直到所有 IDLE 窗口都关闭才结束。这可能不是人们想要的。
如果可以接受在单独的窗口中运行 Shell,则可以从 python.main 中提取仅运行 Shell 所需的 10-20 行。需要进行一些实验。如果主应用程序使用 tkinter,此函数应将应用程序的根作为参数,而不是调用 mainloop()。
推荐阅读
- mongodb - 如何使用用户名和密码在 Asp.Net Core 中访问 MongoDb?
- pandas - 当不能立即清楚什么是重复项时,附加一个没有重复项的数据框
- c++ - 通过增强几何从多边形(环)裁剪多边形(环)的一部分
- html - 自定义复选框 - 通过单击标签停止复选框的能力
- ssas - MDX 计算选项卡
- ios - 在 Swift 中将多个参数传递给 UIAlertAction
- visual-studio-2017 - ASP.NET Core 2.0 如何在 launchSettings.json 中增加 IIS Express 请求超时
- c# - 从 MVC1 升级到 MVC5 后下拉列表不起作用
- boost - boost asio 同步发布的任务
- python - 如何使用 tkinter 中的按钮在 Entry 中输入数字