TclError:无法调用" destroy"命令:应用程序已被破坏

时间:2016-02-28 18:35:06

标签: python python-2.7 tkinter

我是一名蟒蛇初学者。尝试创建一个新按钮来关闭窗口。我收到了错误消息:

  

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

6 个答案:

答案 0 :(得分:3)

您的代码存在许多问题

  1. 缩进错误
  2. 混合grid()pack()
  3. 您是import tkinter as tk还是from tkinter import *,即是 self.root = tk.Tk()import as tk)或
    label_1 = Label(self, text="Username")from tkinter import *
  4. 程序中没有mainloop
  5. 在课堂上使用全球不是必要的,而且风格很差
  6. 在任何情况下,以下修改过的代码都会运行,所以希望它会有所帮助。

    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)

如果您错误地破坏了已经被破坏或尚未创建的根窗口,则会发生这种错误