Tkinter: дождитесь нажатия любой из нескольких кнопок и после этого удалите все кнопки - PullRequest
0 голосов
/ 03 мая 2020

У меня есть интерфейс с двумя кнопками. Они имеют взаимоисключающие действия и генерируются при выполнении определенного условия в фоновом режиме для -l oop. Пользователь должен щелкнуть один из них, а затем кнопки должны исчезнуть. Они могут появиться снова, когда условие выполнено снова в фоновом режиме для -l oop. Вы можете подумать о кнопках создания типа «выбрать точно один из этих ...». For-l oop в фоновом режиме должен ждать ввода пользователя. Поэтому я использую метод wait_variable на кнопках.

Чтобы смоделировать это, я написал следующее MWE:

import tkinter as tk

root = tk.Tk()

a, b = 0, 0

var = tk.IntVar()

def Aaction():
    global a
    a += 1
    var.set(var.get()+1)
    b1.destroy()
    b2.destroy()

def Baction():
    global b
    b += 1
    var.set(var.get()+1)
    b1.destroy()
    b2.destroy()

# this happens before A and B are displayed
print('some code executing')

b1 = tk.Button(root, text='A', command=Aaction)
b1.pack()

b2 = tk.Button(root, text='B', command=Baction)
b2.pack()

b1.wait_variable(var)
print('b1 finsihed waiting')
b2.wait_variable(var) # what happens to this? `b2` is deleted when `b` is clicked. so...?
print('b2 finsihed waiting') # this is never reached

# this should happen after either A or B was clicked
print('some more code executing')

root.mainloop()

Этот код не соответствует тому, что я намереваюсь, но это абстракция как я пытался решить это в моем коде. Мой вопрос: как вы решаете это правильно?

1 Ответ

0 голосов
/ 03 мая 2020

Может ли что-то подобное работать?

import tkinter as tk

root = tk.Tk()

def Aaction():
    b1.destroy()
    b2.destroy()
    do_later()

def Baction():
    b1.destroy()
    b2.destroy()
    do_later()

# this happens before A and B are displayed
print('some code executing')

b1 = tk.Button(root, text='A', command=Aaction)
b1.pack()

b2 = tk.Button(root, text='B', command=Baction)
b2.pack()

# this should happen after either A or B was clicked
def do_later():
    print('some more code executing')

root.mainloop()
...