【问题标题】:How to close top level tkinter window with a button, if button in the window already is bound to a function如果窗口中的按钮已经绑定到函数,如何使用按钮关闭顶级 tkinter 窗口
【发布时间】:2019-09-17 15:49:09
【问题描述】:

我对 tkinter 和 Python 有点陌生,并且正在从事一个为期一学期的项目。基本上我有一个主 tkinter 窗口,然后根据用户输入从该窗口调用顶级窗口。在每个顶层窗口中,我都有一个执行功能的按钮,我还希望此按钮在执行该功能后关闭顶层窗口。解决这个问题的最佳方法是什么?

我试图销毁或关闭窗口,但它最终也关闭了主窗口。我只是在寻找一种方法来关闭 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()

添加支付类

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 函数中的某些内容在 add_pay 函数以某种方式执行后关闭 topLevel 窗口。提前致谢

【问题讨论】:

  • 只需在add_payment() 末尾调用self.master.destroy()
  • @acw1668:这将破坏根窗口,这正是 OP 试图避免的。
  • 没有。 self.master in AddPayment 被分配给传递的master,即top。所以self.master.destroy() 会破坏top
  • @acw1668 这很有道理,谢谢。我不确定我过去调用的内容也破坏了主窗口,但这最终起作用了

标签: python tkinter


【解决方案1】:

你有几个问题。一方面,您永远不应多次致电mainloop。您需要从enter_button 函数中删除对mainloop() 的调用。

另一个问题是您没有保存对顶层的引用,因此您几乎不可能销毁它。您只需要保存一个参考,然后在参考上调用destroy

self.top = Toplevel()
...
self.top.destroy()

【讨论】:

  • 我最终摆脱了所有的 mainloop() 调用,然后我在 add_pay() 函数中使用了 self.master.destroy(),因为 master 是对 top 的引用。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-25
  • 2014-07-16
  • 2018-05-02
  • 2019-09-27
  • 2012-05-14
  • 1970-01-01
相关资源
最近更新 更多