首页 > 解决方案 > 我想在我的 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 框架。请给出代码。提前致谢。

标签: python-3.xtkinterpython-idle

解决方案


Stackoverflow 不是代码编写服务。相反,目的是帮助编写代码。通常最好在提出问题之前编写一些代码,但在这种情况下,您在编码之前就被卡住了。

idlelib 实现 IDLE。虽然您可以自由使用它,但它是私有的,因为代码和接口可以在任何版本中更改,而没有通常的向后兼容性限制。随意导入和使用 idlelib 模块。

目前,Shell 窗口是具有菜单和框架的顶层。后者有一个文本和垂直滚动条。无法在框架内(或另一个 Toplevel 或 root = Tk())可视地嵌入 Toplevel。 top = Toplevel(myframe)有效,但top不能在placed、packed 或gridded 内myframe

我希望将来重构 editor.py 和 pyshell.py 以便将带有菜单的窗口与带有可滚动文本的框架分开。结果应包括parent作为参数的可嵌入 EditorFrame 和 ShellFrame 类。但那是在未来。

目前,可以在 python 中使用import idlelib.idle. 但是,因为它运行 mainloop()(在它自己的根上),所以它会阻塞并且直到所有 IDLE 窗口都关闭才结束。这可能不是人们想要的。

如果可以接受在单独的窗口中运行 Shell,则可以从 python.main 中提取仅运行 Shell 所需的 10-20 行。需要进行一些实验。如果主应用程序使用 tkinter,此函数应将应用程序的根作为参数,而不是调用 mainloop()。


推荐阅读