首页 > 解决方案 > ipython/jupyter 中的 tk 问题

问题描述

我正在尝试编写一个用于从 ipython/jupyter 笔记本启动的 gui,但在使用笔记本中的 tkinter 时遇到了麻烦,尤其是在让 tk gui 窗口优雅地关闭时。如何从 jupyter 制作/启动 tkinter gui 然后在不杀死 ipython 内核的情况下关闭它的最佳实践是什么?

这是我第一次尝试使用 tkinter。我发现了很多关于如何使用较旧的 ipython 版本(例如,iPython 3.2)执行此操作的详细信息,但对于较新的版本(我使用的是 iPython 6.5 和 Python 3.7.1)没有那么多。

这是我尝试过的一个例子:

%gui tk

class MyApp:

    def __init__(self, root):
        frame = tk.Frame(root)
        frame.pack()

        self.button = tk.Button(frame, text="Hello", command=self.hello_world)
        self.button.pack(side=tk.LEFT)

        self.quitbutton = tk.Button(frame, text="QUIT", fg="red", command=root.destroy)
        self.quitbutton.pack(side=tk.RIGHT)

    def hello_world(self):
        print("Hello World!")

root = tk.Tk()

app = MyApp(root)

对我来说,这运行良好,直到我尝试关闭 tkinter 窗口:按下我的“退出”按钮或手动关闭窗口会导致内核被杀死或我的 mac 扩展坞中残留的“python”应用程序不会消失除非我强制退出它(这也会杀死 ipython 内核)。

标签: pythontkinterjupyter-notebookipythontk

解决方案


我也面临这个问题。我目前正在为此实施解决方法。

由于该root.destroy()命令不会停止 tkinter 内核的代码,因此我使用了该root.quit()命令。如果您使用root.quit,内核将完成代码,您可以在下一个内核中执行代码,这样,您可以让对话框加载并在运行后面的行时停留在那里。到最后quit(0),一旦我的代码完成了它应该做的事情,我就完全退出了整个事情。


推荐阅读