python - 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 内核)。
解决方案
我也面临这个问题。我目前正在为此实施解决方法。
由于该root.destroy()
命令不会停止 tkinter 内核的代码,因此我使用了该root.quit()
命令。如果您使用root.quit
,内核将完成代码,您可以在下一个内核中执行代码,这样,您可以让对话框加载并在运行后面的行时停留在那里。到最后quit(0)
,一旦我的代码完成了它应该做的事情,我就完全退出了整个事情。
推荐阅读
- django - 通过下一个和上一个按钮循环使用随机浮点值?
- reactjs - “IntrinsicAttributes”类型上不存在属性“ref”
- javascript - Javascript过滤嵌套数组以排除不包含多个元素之一的对象
- installation - 在 Centos 上安装 Eucalyptus?
- build.gradle - 无法在 KMP 应用程序中找到 Kodein-db-0.8.1-beta-samplesources.jar
- scala - scala 中函数式编程的性能
- java - Android onKeyUp() 在某些模拟器上无法正确调用
- javascript - 反应中的静态是什么意思(做)
- python - 使用 sklearn 执行网格搜索以减少交叉验证数据集的有效方法
- maven - PMD maven 插件:如何为测试指定不同的规则集?