我想在我的tkinter窗口中嵌入python控制台。我该怎么办?

时间:2019-05-16 04:34:41

标签: python-3.x tkinter python-idle

我正在制作文本编辑器,并想在我的应用程序中添加IDLE功能。因此,我希望在其中嵌入python IDLE的框架具有原始python IDLE所提供的所有菜单和功能。

我查看了空闲lib的来源,但找不到解决方案。

    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外壳的Tkinter框架,请提供代码。预先感谢。

2 个答案:

答案 0 :(得分:2)

Stackoverflow不是代码编写服务。相反,其目的是帮助编写代码。通常最好是在问一个问题之前先写一些代码,但是在这种情况下,您会在编码之前陷入困境。

idlelib实现IDLE。尽管您可以自由使用它,但是它是私有的,因为代码和接口可以在任何发行版中更改,而没有通常的向后兼容性约束。自行输入并使用idlelib模块。

当前,Shell窗口是具有菜单和框架的顶层。后者具有文本和垂直滚动条。无法以视觉方式将Toplevel嵌入到框架中(或另一个Toplevel或root = Tk())。 top = Toplevel(myframe)有效,但不能在topplacepackgrid删除myframe

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

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

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

答案 1 :(得分:0)

Tcl具有Tkcon.tcl。当每个线程源(表示运行/执行)时,Tkcon.tcl 每个线程都会弹出一个Tk shell / Tk控制台/tkcon.tcl,非常适合调试。并分别通过线程打印消息。 Python有idle.py ...以及如何使用它?仍在寻找例子。 都是相同的Tk基数。为什么找不到合适的例子?到目前为止...继续寻找...