我是一名蟒蛇初学者。尝试创建一个新按钮来关闭窗口。我收到了错误消息:
Tkinter回调中的异常 Traceback(最近一次调用最后一次):文件 " /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk/Tkinter.py" ;, 第1536行,致电 返回self.func(* args)文件" tk_cp_successful.py",第138行,在buttonPushed中 self.root.destroy()File" /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk/Tkinter.py", 1859年,在毁灭 self.tk.call(' destroy',self._w)TclError:无法调用" destroy"命令:应用程序已被销毁
class LoginPage(tk.Frame):
def __init__(self, parent, controller):
self.controller = controller
self.root = tk.Tk()
global entry_1
global entry_2
tk.Frame.__init__(self, parent)
label = tk.Label(self, text="Welcome to VISA Login Page",fg="blue")
label.pack(pady=10,padx=10)
label_1 = Label(self, text="Username")
label_1.pack()
label_2 = Label(self, text="Password")
label_2.pack()
entry_1 = Entry(self)
entry_1.pack()
entry_2 = Entry(self, show="*")
entry_2.pack()
label_1.grid(row=0, sticky=E)
label_1.pack()
label_2.grid(row=1, sticky=E)
label_2.pack()
entry_1.grid(row=0, column=1)
entry_1.pack()
entry_2.grid(row=1, column=1)
entry_2.pack()
checkbox = Checkbutton(self, text="Keep me logged in")
checkbox.grid(columnspan=2)
checkbox.pack()
logbtn = Button(self, text="Login", command = self._login_btn_clickked)
logbtn.grid(columnspan=2)
logbtn.pack()
myButton = Button(self, text="Exit",command = self.buttonPushed)
myButton.pack()
def buttonPushed(self):
self.root.destroy()
def _login_btn_clickked(self):
#print("Clicked")
username = entry_1.get()
password = entry_2.get()
#print(username, password)
if username == "test" and password == "test":
#box.showinfo("Login info", "Welcome Tester")
button1 = ttk.Button(self, text="Please click, Welcome to login!!!",
command=lambda: self.controller.show_frame(StartPage))
button1.pack()
else:
box.showerror("Login failed", "Incorrect username")
答案 0 :(得分:3)
您的代码存在许多问题
grid()
和pack()
import tkinter as tk
还是from tkinter import *
,即是
self.root = tk.Tk()
(import as tk
)或label_1 = Label(self, text="Username")
(from tkinter import *
)mainloop
在任何情况下,以下修改过的代码都会运行,所以希望它会有所帮助。
import sys
if sys.version_info[0] < 3:
import Tkinter as tk ## Python 2.x
else:
import tkinter as tk ## Python 3.x
class LoginPage():
def __init__(self):
self.root=tk.Tk()
label = tk.Label(self.root, text="Welcome to VISA Login Page",fg="blue")
label.grid(row=0)
label_1 = tk.Label(self.root, text="Username")
label_2 = tk.Label(self.root, text="Password")
self.entry_1 = tk.Entry(self.root)
self.entry_2 = tk.Entry(self.root, show="*")
label_1.grid(row=1, sticky="e")
label_2.grid(row=2, sticky="e")
self.entry_1.grid(row=1, column=1)
self.entry_2.grid(row=2, column=1)
## doesn't do anything at this time
##checkbox = tk.Checkbutton(self.root, text="Keep me logged in")
##checkbox.grid(row=3, columnspan=2)
logbtn = tk.Button(self.root, text="Login", command = self._login_btn_clickked)
logbtn.grid(row=9, columnspan=2)
myButton = tk.Button(self.root, text="Exit",command = self.buttonPushed)
myButton.grid(row=10)
self.root.mainloop()
def buttonPushed(self):
self.root.destroy()
def _login_btn_clickked(self):
#print("Clicked")
username = self.entry_1.get()
password = self.entry_2.get()
#print(username, password)
if username == "test" and password == "test":
print "OK login"
#box.showinfo("Login info", "Welcome Tester")
#button1 = ttk.Button(self.root, text="Please click, Welcome to login!!!",
# command=lambda: self.controller.show_frame(StartPage))
#button1.pack()
else:
#box.showerror("Login failed", "Incorrect username")
print "Error"
LP=LoginPage()
答案 1 :(得分:2)
忽略代码中的所有其他问题,前几天我遇到了同样的问题。当您致电self.root.destroy()
时,Tkinter将退出root.mainloop
。然后在您拨打root.mainloop
的地方之后,您可能会拨打root.destroy
。这意味着你试图销毁两次,这是造成错误的原因。解决这个问题的一种方法是让Exception
默默地通过(虽然一般来说这不是好习惯):
try:
root.destroy()
except:
pass
我可能错了,但这是我能想象的唯一导致此错误的事情。
答案 2 :(得分:0)
如果适用,root.quit()
可能会修复错误。
答案 3 :(得分:0)
当您有超过2个主循环时,通常会发生此错误。 除此之外别无其他:
ArrayList<*>
然后创建一个退出按钮:
import sys
答案 4 :(得分:0)
您需要销毁def,因为它们会不断重复。使用“您的定义” .destroy()
来防止发生此错误。我遇到过同样的问题。它是导致我崩溃的def之一,并在if
语句中破坏了这个def解决了我的问题
答案 5 :(得分:0)
如果您错误地破坏了已经被破坏或尚未创建的根窗口,则会发生这种错误