Форум сайта python.su
Есть такой код:
#!/usr/bin/python3 import tkinter as tk # Текстовое поле в одну строку def test_gui(): top, res = tk.Toplevel(root), [None] def callback(): res[0] = entry.get() top.destroy() root.deiconify() root.withdraw() entry=tk.Entry(top) entry.pack() entry.bind('<Return>', lambda e: callback()) entry.focus_set() top.wait_window(top) return res[0] root=tk.Tk() test_gui() test_gui() test_gui() root.mainloop()
Офлайн
Давайте лучше проще. Что нужно сделать. Что делаете и в чем проблема…
Офлайн
4kpt_IIЕсть программа, выполняющее множество действий, в том числе, отображение маленького окошка с возможностью ввода текста, отображение большого окна с возможностью ввода текста, отображение окна с текстом и пр. Проблема в том, что данный код (как и код, приведенный в примере) работает по-разному на разных платформах. На Linux все работает как надо. На Windows после разрушения второстепенного (модального) окна Top фокус при создании другого окна Top почему-то возвращается к root. В итоге, Top висит на экране, но оно почему-то неактивно. Ввести в него что-то можно, только нажав на него мышью или выбрав по Alt+Tab. Окно root для программы бесполезно, все реализовано в Top. Поэтому окно root скрывается путем withdraw. Если же его не скрывать, то оно всегда всплывет раньше Top и перехватит фокус на себя.
Давайте лучше проще. Что нужно сделать. Что делаете и в чем проблема…
Отредактировано vanvanov (Окт. 9, 2014 14:59:27)
Офлайн
Используйте focus_force(). Ну и сама конструкция по возврату значения немножко корявенькая
import Tkinter as tk # Текстовое поле в одну строку def test_gui(): top, res = tk.Toplevel(root), [None] def callback(): res[0] = entry.get() top.destroy() root.deiconify() root.withdraw() entry=tk.Entry(top) entry.pack() entry.bind('<Return>', lambda e: callback()) entry.focus_force() tk.Button(top, text="close", command=lambda: root.destroy()).pack() top.wait_window(top) root=tk.Tk() test_gui() test_gui() test_gui() test_gui() root.mainloop()
Офлайн