Skip to main content
 首页 » 编程设计

python之Tcl 错误 : can't invoke "destroy" command: application has been destroyed

2025年05月04日31zhujiabin

我是一名 Python 初学者。尝试制作一个新按钮来关闭窗口。我收到错误消息:

Exception in Tkinter callback Traceback (most recent call last): File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk/Tkinter.py", line 1536, in call return self.func(*args) File "tk_cp_successful.py", line 138, in buttonPushed self.root.destroy() File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk/Tkinter.py", line 1859, in destroy self.tk.call('destroy', self._w) TclError: can't invoke "destroy" command: application has been destroyed

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") 

请您参考如下方法:

你的代码有很多问题

  1. 缩进错误
  2. 混合 grid() 和 pack()
  3. 你是import tkinter as tk还是from tkinter import *,即
    self.root = tk.Tk()(导入为 tk)或
    label_1 = Label(self, text="Username")(from tkinter import *)
  4. 程序中没有mainloop
  5. 在一个类中使用全局是没有必要的,而且风格很差

无论如何,以下修改后的代码都会运行,希望它能有所帮助。

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()