退出tkinter gui没有错误

时间:2014-11-26 00:28:27

标签: python python-2.7 loops user-interface tkinter

我知道有很多线程朝着同一个方向前进,但我找不到解决方案。很多线程即将关闭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关闭,整个程序也关闭?

非常感谢!最大

2 个答案:

答案 0 :(得分:2)

嗯。 root.quit()一直为我工作没有错误,但如果不适合你,也许这是最好的方法,以便你关闭GUI和程序:

root.destroy()
sys.exit()

答案 1 :(得分:0)

当我尝试从不同的线程关闭应用程序时遇到了麻烦,所以我使用了这段代码,(它将调用GUI线程中的退出)

def exitApp(self):
    self.root.after(100,root.quit)