【问题标题】:Using Jupyter notebook - which is best for this tkinter algrithm? quit(), exit(), sys.exit(), or os.exit()?使用 Jupyter notebook - 哪个最适合这个 tkinter 算法? quit()、exit()、sys.exit() 还是 os.exit()?
【发布时间】:2021-09-14 02:18:45
【问题描述】:

我正在使用 Jupyter notebook 编写一个包含大量“if”语句的 tkinter 算法。

我希望这些“if”语句中的一些在某些点停止运行程序(但不停止运行 tkinter 窗口)而不返回到代码的主要流程。我写了一个小示例应用程序(如下)来说明我的意思。

我尝试过使用 quit()、exit()、sys.exit() 和 os.exit()。 quit() 和 exit() 似乎都可以正常工作,正如预期的那样,他们说“嗨”而不是“再见”。但是当我关闭 tkinter 窗口时,我仍然会得到一些不需要的读数——我认为这可能比 python 或 tkinter 更多的是 Jupyters 错误。它通常说,“内核似乎已经死了。它将自动重新启动。”

示例脚本包含上面的每个命令,它使用注释“#”来打开和关闭行。每个案例的不需要的读数和消息也在脚本中的代码旁边注释。

我担心如果我进一步编码,不需要的读数是否会出现问题甚至是安全威胁,因为其中一些 if 语句将在密码保护区域中使用。我是否正确假设,如果不需要的消息来自 Jupyter,一旦我将代码编译为 exe,这些消息将是良性和透明的?

我的代码如下:

import tkinter
from tkinter import * 
import tkinter as tk

import sys
import os

def routine ():
    
    x = 0

    if x < 1:

        print("Hi")

    # quit()  # Prints Hi and not bye; 
              # when destroyed, it says Kernel Restarting
              # The kernel appears to have died. It will restart automatically.
            
    # exit()  # On an apparent level - it seems to do all the same things as quit.
    
    # sys.exit()    # Prints Hi
                    # and then...
                    # An exception has occurred, use %tb to see the full traceback.
                    # SystemExit
                    # Then the entire systems, including the tkinter window, 
                    # locks up and spin doing nothing.
                    # The close button wont even work.

    # os._exit()  # Exception in Tkinter callback
                # Traceback (most recent call last):
                # File "C:\Users\rrr\lib\tkinter\__init__.py", line 1705, in __call__
                # return self.func(*args)
                # File "<ipython-input-3-c9d340ae6a31>", line 31, in routine
                # os._exit()
                # TypeError: _exit() missing required argument 'status' (pos 1)

    if x > 1:

        print("bye...")


root = Tk()  
root.geometry("300x200+200+200")

btn1 = Button(root, text ="Run A Routine", command = routine)
btn1.pack(pady = 20, anchor='center')

btn1 = Button(root, text ="Close Window", command = root.destroy)
btn1.pack(pady = 20, anchor='center')

root.mainloop()

【问题讨论】:

  • 你的问题来自 jupyter。 Jupyter 通过内核运行你的所有笔记本。当您使用 exit() 时,您会关闭内核并且 jupyter 会抱怨。这就带来了一个问题,如果要将 jupyter 编译成 exe,为什么要使用它来编码?另外,code any further 是什么意思?杀死内核后没有代码运行。

标签: python tkinter jupyter-notebook exit


【解决方案1】:

我想知道“停止运行程序”是什么意思?您的意思是退出您编写的函数/子程序吗?因为如果是这种情况,您应该简单地使用return 退出定义的例程。

如果你想做一些更复杂的事情,你可能需要删除你的 .mainloop() 更新 tkinter 调用,而是使用类似下面的东西:

RUN_FLAG = True
while RUN_FLAG:
    root.update_idletasks()
    root.update()
    time.sleep(0.01)

这将允许您在子例程中更新全局变量 RUN_FLAG 并使用它来超越您的 tkinter,然后完成您的脚本。

另外,附注;在我看来,在 Jupyter 中运行 tkinter 有点奇怪。如果您的解决方案变得更广泛,您可能会从标准 python 脚本中获得更好的性能。我推荐 JetBrains 的“PyCharm”作为 IDE。

【讨论】:

  • 顺便说一句,你们都认为使用 Jupyter 作为编写 tkinter 代码的奇怪地方是对的。一天晚上,我在 Jupyter 中编写 python 并发现我可以通过将代码粘贴到 Jupyter 来运行 tkinter 应用程序。从那以后我就这样做了。我知道它很古怪,但我现在几乎可以使用它手动编写 GUI。我会看看 PyCharm,虽然我想确保它是免费的。
【解决方案2】:

Angus B:我喜欢你关于使用 return 的想法,我不知道我能做到 - 因为我在编程方面还太陌生。但它似乎像我想要的那样工作。下面的代码说明了我的意思。

如果你按原样运行它,那么它会在第 7 行的返回命令处停止,并且会在命令行中打印“Hi A”。

但是如果你注释掉第 7 行,那么它会打印出来

“你好” “嗨 B”

我不太明白使用 return 与使用 exit 或 quit 之间的区别,但 return 似乎做了更多我想要的事情。我会继续研究它。谢谢您的答复。 :)

为了记录,我的问题可能不是前沿研究,但它有点不同并且已经得到回答。如果您愿意,我们可以继续讨论。

import tkinter

def routine (x):
    
    if x == "A":
        print("Hi A1")
        return
        
    if x == "B":
        print("Hi B")
    
    if x == "A":
        print("Hi A2")        
            
root = Tk()  
root.geometry("300x200+200+200")

btn1 = Button(root, text ="Run A Routine", command = lambda: routine("A"))
btn1.pack(pady = 20, anchor='center')

btn1 = Button(root, text ="Close Window", command = root.destroy)
btn1.pack(pady = 20, anchor='center')

root.mainloop()

【讨论】:

  • 关于不同命令的区别:-exit()quit()是同义词,关闭所有python进程;他们完全退出了这个过程。 - return 让你从你所在的当前函数返回,你可以给它参数,让它返回一个值给调用者。
猜你喜欢
  • 2013-02-18
  • 1970-01-01
  • 1970-01-01
  • 2010-10-16
  • 1970-01-01
  • 2012-08-01
  • 1970-01-01
  • 2021-03-15
  • 1970-01-01
相关资源
最近更新 更多