Я только начал изучать, как создавать собственные всплывающие диалоговые окна; и, как оказалось, tkinter messagebox
действительно прост в использовании, но он также не слишком много делает. Вот моя попытка создать диалоговое окно, которое будет вводить данные, а затем сохранять их в имени пользователя.
Мой вопрос в том, какой рекомендуемый стиль для реализации этого? Как предложил Брайан Окли в этот комментарий.
Я бы не советовал использовать глобальную переменную. Вместо того, чтобы диалоговое окно уничтожало себя, пусть оно уничтожит только фактический виджет, но оставит объект в живых. Затем вызовите что-то вроде
inputDialog.get_string()
, а затемdel inputDialog
из вашей основной логики.
Возможно, использование глобальной переменной для возврата моей строки — не лучшая идея, но почему? И каков предложенный способ? Я запутался, потому что я не знаю, как вызвать getstring после уничтожения окна, и... строка об уничтожении фактического виджета, я не уверен, имеет ли он в виду TopLevel
.
Причина, по которой я спрашиваю, заключается в том, что я хочу, чтобы всплывающее окно уничтожалось после того, как я нажму кнопку отправки; потому что я все-таки хочу, чтобы он вернулся к основной программе, что-то обновил и т.д.Что в этом случае должен делать метод кнопки send
? Потому что идея в этом конкретном примере состоит в том, чтобы позволить пользователю делать это снова и снова, если он того пожелает.
import tkinter as tk
class MyDialog:
def __init__(self, parent):
top = self.top = tk.Toplevel(parent)
self.myLabel = tk.Label(top, text='Enter your username below')
self.myLabel.pack()
self.myEntryBox = tk.Entry(top)
self.myEntryBox.pack()
self.mySubmitButton = tk.Button(top, text='Submit', command=self.send)
self.mySubmitButton.pack()
def send(self):
global username
username = self.myEntryBox.get()
self.top.destroy()
def onClick():
inputDialog = MyDialog(root)
root.wait_window(inputDialog.top)
print('Username: ', username)
username = 'Empty'
root = tk.Tk()
mainLabel = tk.Label(root, text='Example for pop up input box')
mainLabel.pack()
mainButton = tk.Button(root, text='Click me', command=onClick)
mainButton.pack()
root.mainloop()