The tkinter method wait_window
does exactly what you want, though you could also use wait_visibility
or even wait_variable
. You claim wait_window
is unreliable but that method has been a part of tk for decades and I've personally never seen it misbehave.
I recommend implementing this with two pieces of code: a class that implements the window itself, and a function which uses the class to display the window and return the selected item.
The following gives an example. Notice that the value self.selection
is initialized to None
, and then set to a value when the user clicks the "Confirm Selection" button. Also notice that the show
method will get this value before destroying the widget so that it can be retrieved even after the widget has been destroyed.
class SuggestionPopup(tk.Toplevel):
def __init__(self, parent, suggestions):
super().__init__(parent)
self.title("Select suggestion")
self.listbox = tk.Listbox(self, height=10, width=20)
self.listbox.pack(pady=15)
self.btn = tk.Button(self, text="Confirm selection", command=self.select)
self.btn.pack(pady=10)
for (idd, info) in suggestions :
self.listbox.insert(tk.END, info)
self.selection = None
def select(self):
selection = self.listbox.curselection()
if selection:
self.selection = self.listbox.get(selection[0])
self.destroy()
def show(self):
self.deiconify()
self.wm_protocol("WM_DELETE_WINDOW", self.destroy)
self.wait_window(self)
return self.selection
The function to display it might look something like this:
def get_suggestion():
suggestions = ((0, "Item 0"), (1, "Item 1"), (2, "Item 2"))
popup = SuggestionPopup(root, suggestions)
result = popup.show()
return result
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…