Tkinter: Поместите simpledialog.askinteger в коробку верхнего уровня
У меня проблемы с использованием виджета simpledialog внутри виджета верхнего уровня. Приведенный ниже фрагмент кода приводит к появлению пустого всплывающего окна (озаглавленного "Заблокированные поля"), второго всплывающего окна с правильным Simpledialog (также работает нормально) и основного игрового окна (не показанного здесь в коде).
Я хочу избавиться от второго устаревшего окна, и я считаю, что это, должно быть, простая вещь, но я застрял (полный новичок в Python, если вы уже не можете сказать). Любые намеки высоко ценятся!
import tkinter as tk
from tkinter import simpledialog
root = tk.Tk()
root.geometry("580x400+300+200")
root.title("Pah Tum")
#Popup window
block_request_top = tk.Toplevel()
block_request_top.title("Blocked fields")
entry_block = simpledialog.askinteger("Blocked fields", \
"Please enter a number of fields to be blocked. Choose an \
uneven number between 5,13]", parent=block_request_top, minvalue=5, \
maxvalue=13)
2 ответа
Вам не нужно Toplevel()
окно вообще. askinteger()
является диалоговым окном и не требует контейнерного виджета. Просто пропустите код окна block_request_top.
import tkinter as tk
from tkinter import simpledialog
root = tk.Tk()
root.geometry("580x400+300+200")
root.title("Pah Tum")
# Popup window
#block_request_top = tk.Toplevel()
#block_request_top.title("Blocked fields")
entry_block = simpledialog.askinteger("Blocked fields",
"Please enter a number of fields to be blocked. Choose an \
uneven number between 5,13]", parent=root, minvalue=5, # parent changed...
maxvalue=13)
print('Okay, I will block %d fields.' % entry_block) # new, to see value
# set up the rest of your GUI
root.mainloop() # You need this for the GUI to remain alive.
Значение parent было обновлено до root, чтобы отразить уход окна Toplevel.
Вам также нужен вызов root.mainloop() в конце, чтобы графический интерфейс оставался активным и работающим. Как только ваша программа попадает сюда, система Tkinter просто ждет, когда произойдут "события", например, пользователь нажимает кнопку или вводит текст в поле. Вы все еще должны связать все это со всеми кнопками, которые вы должны нарисовать. Есть несколько человек, пишущих об этой же проблеме.
Самый простой способ достичь этой конкретной проблемы - использовать withdraw
, iconify
а также deiconify
методы по созданию entry_block
между ними, как в:
...
block_request_top.withdraw()
entry_block = simpledialog.askinteger("Blocked fields", \
"Please enter a number of fields to be blocked. Choose an \
uneven number between 5,13]", parent=block_request_top, minvalue=5, \
maxvalue=13)
block_request_top.iconify()
block_request_top.deiconify()
весь код:
import tkinter as tk
from tkinter import simpledialog
root = tk.Tk()
root.geometry("580x400+300+200")
root.title("Pah Tum")
#Popup window
block_request_top = tk.Toplevel()
block_request_top.title("Blocked fields")
block_request_top.withdraw()
entry_block = simpledialog.askinteger("Blocked fields", \
"Please enter a number of fields to be blocked. Choose an \
uneven number between 5,13]", parent=block_request_top, minvalue=5, \
maxvalue=13)
block_request_top.iconify()
block_request_top.deiconify()
Я очень сомневаюсь, что это то, что вы в конечном итоге будете использовать, хотя.