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()

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

Другие вопросы по тегам