首页 文章

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

提问于
浏览
1

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

Tkinter回调中的异常回溯(最近一次调用最后一次):文件“/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk/Tkinter.py”,第1536行,在电话中return self.func(* args)文件“tk_cp_successful.py”,第138行,在buttonPushed self.root.destroy()文件“/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ lib-tk / Tkinter.py“,第1859行,在destroy 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")

4 回答

  • 0

    您的代码存在许多问题

    • 缩进错误

    • 混合 grid()pack()

    • import tkinter as tkfrom 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()
    
  • 3

    忽略代码中的所有其他问题,前几天我遇到了同样的问题 . 当您调用 self.root.destroy() 时,Tkinter将退出 root.mainloop . 然后在你调用 root.mainloop 的地方之后你可能会调用 root.destroy . 这意味着你试图销毁两次,这是造成错误的原因 . 解决这个问题的一种方法是让 Exception 默默地通过(虽然一般来说这不是好习惯):

    try:
        root.destroy()
    except:
        pass
    

    我可能错了,但这是我能想象的唯一导致这个错误的事情 .

  • 2

    如果适用, root.quit() 可能会修复错误 .

  • 0

    当您有超过2个主循环时,通常会发生此错误 . 除此之外什么都不做:

    import sys
    

    然后创建一个退出按钮:

    B=tk.Button(self.root,text="quit",command=lambda:sys.exit())
    B.grid()
    

相关问题