Вот в чем проблема: когда пользователь нажимает кнопку X, функция closed
вызывается автоматически через операционную систему.Tkinter (и другие системы с графическим интерфейсом) обладают тем свойством, что ваша программа управляется действиями пользователя, которые создают «события», в результате которых ваши «обработчики событий» вызываются для вас средой.В вашем случае ваша функция closed
является обработчиком, и событие щелкает X.
Когда ваш код попадает в функцию mainloop
, он не возвращается немедленно.Вместо этого программа ожидает пользовательских событий.Когда одно из этих пользовательских событий приводит к уничтожению корневого объекта tk (в вашем случае это mibox.destroy()
), вызов mainloop возвращается в этот момент.Здесь вы снова звоните closed()
.Это приводит к тому, что диалоговое окно появляется во второй раз.Среда tk должна открыть пустое окно tk, чтобы иметь к чему прикрепить это диалоговое окно.Вот почему вы видите второй диалог и второе окно.Проблема в том, что явный вызов функции closed ().
Я изменил вашу программу, и теперь она работает.Я также сделал пару других изменений.Я переместил объявление глобальной переменной на самый внешний уровень отступа - мне не нравится создавать глобальные переменные внутри функций, это делает код слишком сложным для отслеживания.Вам нужен глобальный оператор внутри функции closed
;в противном случае Python создает локальную переменную с тем же именем вместо изменения глобальной.Я также печатаю значение глобала в конце, независимо от того, истинно оно или нет.
Если это не сработает, просто позвоните по телефону 1-800-273-8255.
from tkinter import *
from tkinter import messagebox
spamreturn = False
#pop up
def spam():
def closed():
global spamreturn
if messagebox.askokcancel("Quit", "Do you really wish to quit?"):
spamreturn = True
mibox.destroy()
mibox = Tk()
topframe = Frame(mibox)
miLabel = Label(mibox, text="Call 1-800-273-8255")
mibutton = Button(topframe, text="Your Computer has been infected")
mibutton2 = Button(topframe, text="Please call 1-800-273-8255 for Assistance")
miLabel.pack()
mibutton.pack()
mibutton2.pack()
topframe.pack()
mibox.geometry("300x100+500+250")
mibox.protocol("WM_DELETE_WINDOW", closed)
mibox.mainloop()
spam()
print(spamreturn)