Python 在Mac上退出Tkinter GUI而不使用sys.exit()的可靠方法

Python 在Mac上退出Tkinter GUI而不使用sys.exit()的可靠方法,python,macos,tkinter,Python,Macos,Tkinter,我的主要目标是在PyPi发行版中打包一个GUI,允许用户在不使用sys.exit()的情况下导入、打开和干净地退出GUI。 下面是一个简单的例子: gui.py: 从tkinter导入Tk,按钮 类GUI(Tk): 定义初始化(自): Tk.\uuuuuu初始(自我) 按钮(text='QUIT',command=lambda:[self.destroy(),self.QUIT()]).grid(行=0,列=0) def run(): root=GUI() root.mainloop() 现在

我的主要目标是在PyPi发行版中打包一个GUI,允许用户在不使用sys.exit()的情况下导入、打开和干净地退出GUI。

下面是一个简单的例子:

gui.py

从tkinter导入Tk,按钮
类GUI(Tk):
定义初始化(自):
Tk.\uuuuuu初始(自我)
按钮(text='QUIT',command=lambda:[self.destroy(),self.QUIT()]).grid(行=0,列=0)
def run():
root=GUI()
root.mainloop()
现在,如果我将此作为一个包来使用,我会调用:

导入gui >>>gui.run() 当我单击“退出”按钮时,python挂起,窗口保持打开状态,我必须强制退出。将sys.exit()添加到'QUIT'命令中确实有效,但它会终止Python会话,这是我不想做的,因为我希望用户在关闭GUI后能够访问我的包的其他功能。如果使用
直接运行代码时,如果
,则这也不起作用

这段代码在Windows上运行良好-它创建了一个python.exe实例,并在按“QUIT”时完全退出,没有任何问题。有没有关于如何在Mac上实现这一点的想法?

试试:

root.destroy()
也许这会奏效

编辑:用窗口的名称替换root,如您所说:

从tkinter导入*
mywindow=Tk()
mywindow.mainloop()
然后做:

mywindow.destroy()
举例说明您的代码:

从tkinter导入Tk,按钮
类GUI(Tk):
def quit():
自我毁灭
定义初始化(自):
Tk.\uuuuuu初始(自我)
按钮(text='QUIT',command=QUIT).grid(行=0,列=0)
def run():
root=GUI()
root.mainloop()
试试:

root.destroy()
也许这会奏效

编辑:用窗口的名称替换root,如您所说:

从tkinter导入*
mywindow=Tk()
mywindow.mainloop()
然后做:

mywindow.destroy()
举例说明您的代码:

从tkinter导入Tk,按钮
类GUI(Tk):
def quit():
自我毁灭
定义初始化(自):
Tk.\uuuuuu初始(自我)
按钮(text='QUIT',command=QUIT).grid(行=0,列=0)
def run():
root=GUI()
root.mainloop()


self.destroy()
应该是您所需要做的全部。这将破坏根窗口并导致退出
mainloop()
。您是否在不尝试调用self.quit()的情况下使用trid
command=self.destroy
?不过,您的代码在我的Mac上运行良好。是的,仅使用self.destroy不会关闭窗口或应用程序。您是否使用某种工具将python代码转换为应用程序?当我像你的问题中那样创建一个名为gui.py的文件,然后在交互式提示中使用该模块时,它的行为与我预期的一样。那么你使用上面的方法吗?我也在做同样的事情,但它不起作用。也许这是一个糟糕的安装?您使用的是什么外壳-我使用的是终端。是的,我使用的是您问题中描述的确切方法。我用代码的副本/粘贴创建了一个名为“gui.py”的文件。然后我运行了一个交互式python shell,输入
importgui
,然后输入
gui.run()
。然后我点击了退出按钮。之后,我可以在提示符中键入其他命令。
self.destroy()
应该是您所需要做的全部。这将破坏根窗口并导致退出
mainloop()
。您是否在不尝试调用self.quit()的情况下使用trid
command=self.destroy
?不过,您的代码在我的Mac上运行良好。是的,仅使用self.destroy不会关闭窗口或应用程序。您是否使用某种工具将python代码转换为应用程序?当我像你的问题中那样创建一个名为gui.py的文件,然后在交互式提示中使用该模块时,它的行为与我预期的一样。那么你使用上面的方法吗?我也在做同样的事情,但它不起作用。也许这是一个糟糕的安装?您使用的是什么外壳-我使用的是终端。是的,我使用的是您问题中描述的确切方法。我用代码的副本/粘贴创建了一个名为“gui.py”的文件。然后我运行了一个交互式python shell,输入
importgui
,然后输入
gui.run()
。然后我点击了退出按钮。之后,我可以在提示符中键入其他命令。我希望将GUI保留在类中。我确实在lambda中使用了destroy()命令,但我尝试在mainloop()之后将其移动到run(),但仍然不起作用。你能举一个例子来说明使用我的代码结构是什么意思吗?是的,让我等一下^^好的,检查我在回答中所做的编辑,告诉我这是否是你想要的!问题是这个例子和sys.exit()一样-它退出python shell。。。好吧,我会搜索,如果我找到了,我会告诉你^^我想把我的GUI保存在一个类中。我确实在lambda中使用了destroy()命令,但我尝试在mainloop()之后将其移动到run(),但仍然不起作用。你能举一个例子来说明使用我的代码结构是什么意思吗?是的,让我等一下^^好的,检查我在回答中所做的编辑,告诉我这是否是你想要的!问题是这个例子和sys.exit()一样-它退出python shell。。。好吧,我会搜索,如果我找到了,我会告诉你^^