ткинтер не печатает до закрытия окна - PullRequest
1 голос
/ 31 мая 2019

Вот минимальный пример, в котором щелчок левой кнопкой мыши создает всплывающее окно с несколькими вариантами выбора.После выбора всплывающее окно уничтожается, и выборка печатается.

import tkinter as tk

class Interface(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)
        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()
        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=lambda:popup.destroy()).pack()
        popup.mainloop()
        print("choice:", var.get())

main = Interface()
main.mainloop()

Он почти работает, однако печатается только после главное окно закрывается.Кроме того, я не понимаю, почему некоторые кнопки кажутся уже выбранными.

[Python 3.7, Windows 10]

1 Ответ

0 голосов
/ 31 мая 2019

Я не совсем уверен, почему ваш код не работает, но думаю, что он имеет какое-то отношение к тому, что эффективно работают два 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...