Я не совсем уверен, почему ваш код не работает, но думаю, что он имеет какое-то отношение к тому, что эффективно работают два mainloop()
- один «вложен» в другой - так что завершение внутреннего не происходит.не позволяет следующей строке в методе choice()
выполняться до тех пор, пока не закончится и внешняя строка для главного окна.
Независимо от того, является ли это объяснение верным или нет, способ обойти проблему заключается в определениифункция обратного вызова отдельно, чтобы было легко помещать в нее несколько операторов, а затем помещать всплывающие destroy()
и print()
вызовы в этом:
import tkinter as tk
class Interface(tk.Tk):
def __init__(self):
super().__init__()
self.can = tk.Canvas(self, background="green", width=500, height=500)
self.can.pack()
self.bind('<Button-1>', self.choice)
def choice(self, event):
popup = tk.Toplevel()
popup.attributes('-topmost', 'true')
var = tk.IntVar()
def callback():
popup.destroy()
print("choice:", var.get())
tk.Radiobutton(popup, text="Zero", value=0, variable=var, indicator=0).pack()
tk.Radiobutton(popup, text="0ne", value=1, variable=var, indicator=0).pack()
tk.Radiobutton(popup, text="Confirm", fg="red", indicator=0,
command=callback).pack()
popup.mainloop()
main = Interface()
main.mainloop()