如何使用idlelib.PyShell在tkinter程序中嵌入解释器?

2024-01-23

我需要将交互式 python 解释器嵌入到我的 tkinter 程序中。谁能帮我看看如何整合它?

我已经看过了main()功能,但它对于我的需求来说太复杂了,但我似乎无法在不破坏它的情况下减少它。


您必须执行的操作的一些细节可能取决于 IDLE Shell 运行后您想要对其执行的操作。我想了解更多相关信息。但让我们从简单开始,对 pyshell.main 进行最小的更改,使其与其他代码一起运行。

请注意,在我下面使用的 3.6 中,PyShell.py被重命名pyshell.py。另请注意,这里的所有内容都相当于使用 IDLE 的私有内部结构,并且“使用风险由您自行承担”。

我假设您想在与 tkinter 代码相同的进程(和线程)中运行 Shell。将签名更改为

def main(tkroot=None):

更改根创建(查找# setup root) to

if not tkroot:
    root = Tk(className="Idle")
    root.withdraw()
else:
    root = tkroot

在当前的 3.6 中,还有几行需要缩进if not tkroot:

    if use_subprocess and not testing:
        NoDefaultRoot()

保护主循环并销毁(最后)

if not tkroot:
    while flist.inversedict:  # keep IDLE running while files are open.
        root.mainloop()
    root.destroy()
# else leave mainloop and destroy to caller of main

上面将根窗口的“依赖注入”添加到函数中。我可能会在 3.6 中添加它以使测试(“其他代码”的示例)更容易。

现在运行以下 tkinter 程序,显示根窗口和 IDLE shell。

from tkinter import *
from idlelib import pyshell

root = Tk()
Label(root, text='Root id is '+str(id(root))).pack()
root.update()
def later():
    pyshell.main(tkroot=root)
    Label(root, text='Use_subprocess = '+str(pyshell.use_subprocess)).pack()

root.after(0, later)
root.mainloop()

您应该可以随时调用 pyshell.main 。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用idlelib.PyShell在tkinter程序中嵌入解释器? 的相关文章

随机推荐