Вывод окна Python Tkinter и ввод оболочки - PullRequest
0 голосов
/ 18 февраля 2012

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

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

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

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

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, если это имеет значение)

Ответы [ 2 ]

1 голос
/ 18 февраля 2012

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

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

1 голос
/ 18 февраля 2012

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

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

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

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

...