Некоторые детали того, что вы должны делать, могут зависеть от того, что вы хотите делать с оболочкой IDLE после ее запуска. Я хотел бы узнать об этом больше. Но давайте начнем с простого и внесем в pyshell.main минимальные изменения, необходимые для его работы с другим кодом.
Обратите внимание, что в версии 3.6, которую я использую ниже, PyShell.py
переименован в pyshell.py
. Также обратите внимание, что все здесь сводится к использованию частных внутренних компонентов IDLE и «используйте на свой страх и риск».
Я предполагаю, что вы хотите запустить Shell в том же процессе (и потоке), что и ваш код tkinter. Измените подпись на
def main(tkroot=None):
Измените создание корня (найдите # setup root
) на
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.
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, когда захотите.
person
Terry Jan Reedy
schedule
16.08.2016