【问题标题】:Tkinter quit freezesTkinter 退出冻结
【发布时间】:2017-12-05 10:42:43
【问题描述】:

我写了一个非常简单的sn-p代码只是为了试试tkinter

import tkinter as tk

root=tk.Tk()
frame = tk.Frame(root).pack()
button = tk.Button(frame,
                   text="next",
                   command=root.quit).pack()
root.mainloop()

上面的代码导致窗口冻结。有人可以向我解释这种行为背后的原因是什么吗?

【问题讨论】:

  • 这可能是因为pack() 方法返回了您分配给frame 变量的None。将其更改为frame = tk.Frame(root),并在其下方添加一行frame.pack()
  • 永远不要x = tk.Button(...).pack() - 将它分成两行。
  • 按预期工作,不冻结@常规文本编辑器 + Python 3.6 + TkVersion 8.6 + Windows 7。
  • 不知何故链接到this

标签: python tkinter


【解决方案1】:

在游戏中为时已晚,但我之前也遇到过类似的问题。我使用 Jupyter Notebook 运行代码。

不要使用command=root.quit,而是使用command=root.destroy。我不是专家,但如果我理解正确,root.quit 也会尝试退出 IDE,而root.destroy 只会退出 Tkinter 窗口。

【讨论】:

  • 这也是我必须做的。 root.quit 总是在 root.destroy 起作用的地方冻结。我正在使用带有 .ipynb 格式文件的 VSCode。不确定这是否重要。
  • 是的,这是正确的。我使用 spyder 并发现它是我尝试解决问题的唯一方法。
【解决方案2】:

我遇到了同样的问题。

我正在使用 Python 3.7 和 Spyder。主要问题是 Spyder,而不是代码。 我改用 Jupyter Notebook 并且它工作正常。

【讨论】:

    【解决方案3】:

    pack() 与初始化行分开将解决您的问题。

    import tkinter as tk
    root=tk.Tk()
    frame=tk.Frame(root)
    frame.pack()
    button = tk.Button(frame,text="next",command=root.quit)
    button.pack()
    root.mainloop()
    

    【讨论】:

    • 我看不出几何管理器的分离与 OP 的经历有什么关系。仍然使用放置的选项创建小部件,只是不完全可引用,并且由于 root 已正确初始化,command=root.quit 选项应该可以正常工作。
    • 建议的答案解决了我这边的问题。鉴于您上面的 cmets 声明我的代码适用于您,可能取决于配置
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-08
    • 2021-06-24
    • 2021-07-04
    • 2018-05-03
    • 2015-11-11
    • 2018-10-31
    • 1970-01-01
    相关资源
    最近更新 更多