在销毁父窗口后陷入无限循环(python,Tkinter)

时间:2018-03-26 13:52:05

标签: python-3.x tkinter

我遇到的问题是我似乎陷入无限循环,(如果我不是,请纠正我)。我在Windows 10上使用tkinter for python 3.6(64位)。

在我遇到问题的模块中,我有3个输入小部件和2个按钮。两个按钮都调用" destroy()"函数以杀死父窗口。

下面是我模块的大量抽象版本,模块的目的是从条目小部件中获取输入并将它们写入文件。

def Create():
    parent = Tk()
    parent.MakeItlookNice
    entry1 = Entry(parent)
    entry1.insert(INSERT, "Please enter your desired username here")
    entry2 = Entry(parent)
    entry2.insert(INSERT, "Please enter your desired password here")
    entry3 = Entry(parent)
    entry3.insert(INSERT, "What is your mother's maiden name")
    Submit = tk.Button(parent,
                       text ="Click here to submit your stuff",
                       command = lambda: [parent.destroy(),
                                          submit.function()])
    Cancel = tk.Button(parent,
                       text ="Click here to cancel your request",
                       command = lambda: parent.destroy())
    parent.mainloop()

此功能包含在模块" RegisterNewUser"中。 "菜单" module是调用此函数的模块。据我所知,一旦调用了parent.destroy(),就没有更多的代码可以执行,因为它全部包含在parent.mainloop()中,因此该函数已经完成并且"菜单"模块应该继续执行。

会发生什么:

  1. 我想要提交按钮来销毁窗口,执行该功能,然后返回"菜单"模块。
  2. 我希望取消按钮销毁窗口并返回"菜单"模块。
  3. 实际发生的事情:

    1. 窗口关闭,就像它应该
    2. 一样
    3. 但是"菜单中的代码"模块不再开始执行
    4. 当我关闭python shell时,它警告我程序仍在运行
    5. 最终我的问题是,什么代码仍在运行,为什么它没有停止?

      感谢您阅读本文,如果您需要更多详细信息,请告知我们。

      编辑:在发布此问题之前,我已就此主题进行了研究。我已经阅读了关于tk.destroy()函数和tk.mainloop()函数的文档,我还在IDLE中打开了Tkinter模块,试图了解更深层次的情况,但毕竟这是仍然无法找到解决方案。这是我关于堆栈溢出的第一个问题,请原谅我,如果我做错了什么。

3 个答案:

答案 0 :(得分:0)

嗯,所以你说多个窗户?实现复杂UI的更简单方法是使用称为框架的概念。如果切换到新框架,Tkinter允许您完全更改屏幕和布局。这可能需要您重新编程很多代码。例如,请参阅Switch between two frames in tkinter 此外,有些人在youtube上使用tkinter和框架构建了一个非常好的比特币监控应用程序

答案 1 :(得分:0)

我认为你可能会在这里使用Toplevel()受益。

我已将您提供的代码添加到用于创建主窗口和管理弹出窗口的类中。

我注意到你的一些代码。

它的显而易见的是你要像这样两次导入tkinter:

import tkinter as tk
from tkinter import *

我可以告诉你如何编写输入字段和按钮。不要这样做。而只是使用了一个或另一个。我建议只使用import tkinter as tk

您正在使用一个函数来创建一个新的tkinter实例,并根据您的问题判断您已准备好为您的菜单创建一个tkinter实例。您可以使用Tk()代替创建新的Toplevel()实例,而不是打开一个新窗口,该窗口可以从主窗口继承所有内容,并且应该更易于管理。

在这种情况下,你真的不需要使用lambda。我也删除了lambda函数,并用一个简单的命令代替。

请查看以下代码,如果您有任何疑问,请与我们联系。

import tkinter as tk


class MyApp(tk.Frame):

    def __init__(self, master, *args, **kwargs):
        tk.Frame.__init__(self, master, *args, **kwargs)
        self.master = master
        self.master.title("Main MENU")

        tk.Button(self.master, text="Open top level", command = self.create).pack()


    def create(self):
        self.top = tk.Toplevel(self.master)
        entry1 = tk.Entry(self.top, width = 35)
        entry1.pack()
        entry1.insert(0, "Please enter your desired username here")
        entry2 = tk.Entry(self.top, width = 35)
        entry2.pack()
        entry2.insert(0, "Please enter your desired password here")
        entry3 = tk.Entry(self.top, width = 35)
        entry3.pack()
        entry3.insert(0, "What is your mother's maiden name")
        tk.Button(self.top, text ="Click here to submit your stuff",
                           command = self.Submit).pack()

        tk.Button(self.top, text ="Click here to cancel your request",
                           command = self.top.destroy).pack()

    def Submit(self):
        print("Do something here to submit data")
        self.top.destroy()

if __name__ == "__main__":
    root = tk.Tk() 
    app1 = MyApp(root)
    tk.mainloop()

答案 2 :(得分:-1)

您可以在您的 toplevel() 之前(或代替)使用 wait_window() 及其库函数 mainloop(),您的问题将得到解决