我遇到的问题是我似乎陷入无限循环,(如果我不是,请纠正我)。我在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()中,因此该函数已经完成并且"菜单"模块应该继续执行。
会发生什么:
实际发生的事情:
最终我的问题是,什么代码仍在运行,为什么它没有停止?
感谢您阅读本文,如果您需要更多详细信息,请告知我们。
编辑:在发布此问题之前,我已就此主题进行了研究。我已经阅读了关于tk.destroy()函数和tk.mainloop()函数的文档,我还在IDLE中打开了Tkinter模块,试图了解更深层次的情况,但毕竟这是仍然无法找到解决方案。这是我关于堆栈溢出的第一个问题,请原谅我,如果我做错了什么。答案 0 :(得分:0)
答案 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()
,您的问题将得到解决