Правильный способ реализации пользовательского всплывающего диалогового окна tkinter

Я только начал изучать, как создавать собственные всплывающие диалоговые окна; и, как оказалось, 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()

19
задан Stevoisiak supports Monica 7 June 2018 в 16:17
поделиться