当前位置: 首页 > 知识库问答 >
问题:

Tcl错误:无法调用“销毁”命令:应用程序已销毁

祖迪
2023-03-14

我是一个蟒蛇初学者。试着做一个新的按钮来关闭窗口。我得到了错误消息:

异常在Tkinter回调Traceback(最近调用最后):文件/系统/库/框架/Python.framework/Versions/2.7/lib/python2.7/lib-tk/Tkinter.py,第1536行,在调用返回self.func(*args)文件tk_cp_successful.py,第138行,在按钮推送self.root.destroy()File"/System/库/框架/Python.framework/Versions/2.7/lib/python2.7/lib-tk/Tkinter.py",第1859行,在销毁self.tk.call中("销毁",自我。_w)TclError: can can can't调用"销毁"命令:应用程序已被销毁

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

共有3个答案

甄云
2023-03-14

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

刘俊语
2023-03-14

忽略了代码中的所有其他问题,前几天我也遇到了同样的问题。当调用self.root.destroy()时,Tkinter将退出root.mainloop。然后在调用root.mainloop的地方之后,您可能会调用root.destroy。这意味着你试图破坏两次,这就是导致错误的原因。处理这种情况的一种方法是让异常静默传递(尽管一般来说这不是好的做法):

try:
    root.destroy()
except:
    pass

我可能错了,但这是我唯一能想象的导致这个错误的原因。

公良俊楚
2023-03-14

你的代码有很多问题

  1. 缩进误差
  2. 混合grid()pack()
  3. 您是将tkinter作为tk导入还是从tkinter import*导入,即
    self。根=tk。Tk()作为Tk导入)或
    标签1=标签(self,text=“Username”)来自tkinter导入*
  4. 程序中无mainloop
  5. 在类中使用global是不必要的,而且样式很差

在任何情况下,下面的修改代码运行,所以希望它会有所帮助。

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

 类似资料:
  • 问题内容: 我需要能够动态加载/卸载角度应用程序而不会引起内存泄漏。在jQuery中,您可以执行相应的销毁代码,事件处理程序未绑定等。 我一直无法在有角度的文档中找到任何内容,提及启动应用程序后可能会拆除应用程序的可能性。 我的第一次尝试是像这样破坏rootScope: 但这似乎不起作用,而且我不确定即使清除了注入器和服务也将如何清理。 应该怎么做? 问题答案: 2013年3月10日更新: 我发现

  • 问题内容: 我已经在bean的“销毁方法”中放入了sysout语句。当我运行示例代码时,sysout没有得到输出。这是否意味着销毁方法未得到调用? 测试类别: The Bean 配置文件: 问题答案: 你的示例不起作用,因为你没有关闭appcontext,只是让程序终止。 调用上下文,你将看到被调用的bean destroy-method。

  • 问题内容: 使用节点8.4.0: 但是,以下错误也不是交互式的:(唯一的区别是分号) 同样在Chrome控制台中: 有人可以解释吗? 澄清度 这与按预期工作的let,var或cosnt解构无关。这与先前定义的变量(或非严格模式)有关:从chrome控制台: 问题答案: 将对象分解为现有变量的正确语法是 这允许成为一种表达。否则,将其解释为带有逗号运算符的块,这将导致错误。 它在控制台中不带括号和分

  • 问题内容: 我在hapijs中使用jwt插件和策略。 我可以在登录用户时创建jwt令牌,并通过’jwt’策略使用同一令牌对其他API进行身份验证。 我将令牌设置为cookie,其中是令牌名称。另外,我没有将这些令牌保存在数据库中。 但是,注销时如何销毁jwt令牌? 请提出一种方法。 问题答案: JWT存储在浏览器中,因此删除令牌以删除客户端的cookie 如果您还需要在令牌到期之前从服务器端使令牌

  • 销毁 Destroy 在不需要使用iScoll的时候调用iScroll实例的公共方法destroy()可以释放一些内存。 myScroll.destroy(); myScroll = null;