Как закрыть окно tkinter верхнего уровня кнопкой, если кнопка в окне уже связана с функцией - PullRequest
1 голос
/ 29 апреля 2019

Я немного новичок в tkinter и Python и работаю над семестровым проектом. По сути, у меня есть главное окно tkinter, затем из этого окна вызываются окна topLevel в зависимости от пользовательского ввода. В каждом окне topLevel у меня есть кнопка, которая выполняет функцию, я также хочу, чтобы эта кнопка закрывала окно topLevel после выполнения этой функции. Как лучше всего подойти к этой проблеме?

Я пытался уничтожить или закрыть окно, но оно также закрывает главное окно. Я просто ищу способ закрыть окно topLevel и выполнить функцию одним нажатием кнопки

class MainWindow:
        # Entry box
        self.entry = StringVar()
        self.text_box = Entry(master, textvariable=self.entry)
        self.text_box.grid(row=1, column=2)

        # Displays and binds button, so when clicked, the enter_button function is called
        self.input_button = Button(master, text='Enter', command=self.enter_button)
        self.input_button.grid(row=1, column=3, sticky='W')


    def enter_button(self):
        # Get user input and perform the given command
        command = self.entry.get()

        # Creates a root for a toplevel window
        top = Toplevel()

        if command == '1':
            add_gui = AddPayment(top)
            top.mainloop()
        elif command == '2':
        #rest of classes/commands

основной

def main():
    root = Tk()
    app = MainWindow(root)
    root.mainloop()


if __name__ == '__main__':
    main()

AddPayment класс

class AddPayment:
    def __init__(self,master):
        self.master = master
        self.add_label = Label(master, text='How much is the payment for?')

        # payment box
        self.pay = StringVar()
        self.pay_box = Entry(master, textvariable=self.pay)
        self.add_button = Button(master, text='Add', command=self.add_payment)

        # position widgets
        self.pay_box.grid(row=1, column=2)
        self.add_label.grid(row=1, column=1)
        self.add_button.grid(row=1, column=3)

    def add_payment(self):
        database.add_pay(self.pay.get())

В этом примере я хотел бы, чтобы что-то в функции add_payment закрывало окно topLevel после того, как функция add_pay выполнена каким-либо образом. Заранее спасибо

1 Ответ

1 голос
/ 29 апреля 2019

У вас есть пара проблем. Во-первых, вы никогда не должны звонить mainloop более одного раза. Вам необходимо удалить вызов на mainloop() из функции enter_button.

Другая проблема заключается в том, что вы не сохраняете ссылку на верхний уровень, поэтому вы сделали более или менее невозможным ее уничтожение. Вам просто нужно сохранить ссылку, а затем вызвать destroy для ссылки.

self.top = Toplevel()
...
self.top.destroy()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...