我知道有很多线程朝着同一个方向前进,但我找不到解决方案。很多线程即将关闭GUI但仍然运行python代码,这就是我不想要的。但请看下面的问题:
我目前正在使用Python 2.7和Windows 7.我正在开发一个程序来分析我从传感器读取的数据。在我完成我的python程序后,我使用cx_freeze将其冻结,以便在没有python或没有matplotlib等的pc上执行它。我遇到的问题是我想添加一个关闭我的应用程序的退出按钮。问题是我尝试了3种不同的可能性,见下文:
import Tkinter
import numpy as np
import matplotlib
from matplotlib import pyplot as plt
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2TkAgg
import globals
import data2plot
#from __builtin__ import file
globals.init()
def plot(x, aw,temperature,water):
#function to plot via matplotlib in the gui
#global file and if someone refresh before load data, default data is test.csv
file = "test"
#Version1
def close_window():
sys.exit()
#Version2
def close_window2():
root.quit()
#Version3
def close_window3():
root.destroy()
# GUI
root = Tkinter.Tk()
draw_button = Tkinter.Button(root, text="Quit", command = close_window)
draw_button.grid(row=1, column=2)
draw_button = Tkinter.Button(root, text="Quit2", command = close_window2)
draw_button.grid(row=1, column=3)
draw_button = Tkinter.Button(root, text="Quit3", command = close_window3)
draw_button.grid(row=1, column=4)
# init figure with the 3 different values and axes
fig = matplotlib.pyplot.figure()
canvas = FigureCanvasTkAgg(fig, master=root)
canvas.get_tk_widget().grid(row=0,column=1)
toolbar = NavigationToolbar2TkAgg(canvas, root)
toolbar.grid(row=1,column=1)
#starts loop for the figure
root.mainloop()
我已经读过,通常我应该使用root.quit()选项。但唯一没有错误的按钮是带有root.destroy()的第三个按钮。问题是如果我使用第三个按钮,GUI正在关闭,但程序仍在运行?我是否也退出了主循环,但是我想我用root.quit()退出了主循环?
其他2个按钮显示错误消息,程序在Windows 7上崩溃,但至少整个程序已关闭。我也试过像一些人建议root.quit没有括号,但根本不起作用。
两个按钮的错误消息是:
致命的Python错误:PyEval_RestoreThread:NULL tstate
此应用程序已请求运行时将其终止 不寻常的方式请联系应用程序的支持团队获取更多信息 信息。
现在我的问题是如何确保我使用我的GUI,绘制一些东西等等,如果我按下退出按钮,GUI关闭,整个程序也关闭?
非常感谢!最大
答案 0 :(得分:2)
嗯。 root.quit()
一直为我工作没有错误,但如果不适合你,也许这是最好的方法,以便你关闭GUI和程序:
root.destroy()
sys.exit()
答案 1 :(得分:0)
当我尝试从不同的线程关闭应用程序时遇到了麻烦,所以我使用了这段代码,(它将调用GUI线程中的退出)
def exitApp(self):
self.root.after(100,root.quit)