Вывод окна Python Tkinter и ввод оболочки

У меня возникла проблема между оболочкой python в моей среде IDE и окном Tkinter. Я пытаюсь сделать так, чтобы весь мой пользовательский ввод был в оболочке, а затем я хотел бы вывести соответствующую информацию в окно Tkinter.

Однако, когда мое окно создано и всплывает, я закрываю его, чтобы продолжить свою программу в оболочке, а затем продолжаю ввод. Однако, когда я пытаюсь повторно инициализировать мое окно. Пишет, что окно разбито. Я понимаю, что это значит, поэтому я попытался создать окно верхнего уровня, в котором я вывожу свою информацию, которую можно закрыть, и скрыть свое корневое окно, но оболочка не будет продолжаться, пока я не закрою/уничтожу также корневое окно.

Есть ли способ продолжить работу в оболочке, не разрушая корневое окно? Я довольно новичок в этом языке, поэтому любая помощь будет очень признательна.

Это моя общая идея:

from Tkinter import *

#get all my info from the shell

root = Tk()
root.withdraw()  #hide the root window

main = Toplevel()
     #this is the window that I want to be able to close and open later

#get more info from the shell after main is closed

#now I want to open the updated main window

Заранее спасибо! (И я работаю над Windows, если это имеет значение)


person TheNewGuy    schedule 18.02.2012    source источник


Ответы (2)


Я не уверен, что способ, которым вы пытаетесь сделать это, является наиболее эффективным, но я бы предложил следующие изменения:

from Tkinter import *

#get all my info from the shell

window = Tk()
window.iconify()  #hide the root window

#get more info from the shell after main is closed

window.deiconify()
window.mainloop() # to handle events

я переименовал ваше корневое окно, чтобы вам было более понятно, что происходит, и удалил лишнее (имхо) дополнительное окно верхнего уровня!

Также имейте в виду, что вы ничего не сделаете без основного цикла и необходимых обработчиков событий!

person Don Question    schedule 18.02.2012

Проще говоря, Tkinter не предназначен для работы. Tkinter был разработан, чтобы иметь одно корневое окно, которое создается один раз, и с одним запущенным циклом обработки событий. Использование любым другим способом обязательно приведет к нежелательному поведению.

Если вам действительно нужен код для работы таким образом, соберите входные данные из оболочки в один процесс, а затем используйте отдельный процесс для отображения окна tkinter. Вы можете либо общаться друг с другом с помощью сокета, либо передавать данные от родителя к дочернему через аргументы, переменные среды или временные файлы.

person Bryan Oakley    schedule 18.02.2012