2014-11-26 6 views
1

동일한 방향으로 많은 스레드 제목이 있음을 알고 있지만 해결책을 찾지 못했습니다. 많은 스레드가 GUI를 닫으려고하지만 여전히 파이썬 코드를 실행하려고합니다. 그게 내가 원하지 않는 것입니다. 하지만 아래 질문을 참조하십시오 :오류없이 tkinter GUI 종료

저는 현재 Python 2.7 및 Windows 7을 사용하고 있습니다. 나는 센서에서 읽은 데이터를 분석하는 프로그램을 개발 중입니다. 파이썬 프로그램을 끝내고 나면 파이썬없이 또는 matplotlib없이 PC에서 실행하기 위해 cx_freeze를 동결시킨다. 내가 가지고있는 문제는 내 응용 프로그램을 닫는 종료 버튼을 추가하고 싶다는 것입니다.

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() 옵션을 사용해야합니다 읽었습니다 : 문제는 내가 3 가지 가능성은 아래 참조하려한다는 것입니다. 하지만 오류없이 작동하는 유일한 버튼은 root.destroy()가있는 세 번째 버튼입니다. 문제는 세 번째 버튼을 사용하면 GUI가 닫히지 만 프로그램이 계속 실행되고있는 것입니까? 메인 루프를 종료 했는데도 rootloop()으로 메인 루프를 종료 했습니까?

다른 2 개의 버튼은 오류 메시지를 표시하며 프로그램은 Windows 7에서 분쇄되지만 프로그램 전체가 닫혀 있습니다. 나는 또한 괄호없이 root.quit을 제안하는 몇몇 사람들처럼 시도했지만 전혀 작동하지 않습니다.

두 개의 버튼에 대한 오류 메시지는 다음과 같습니다

Fatal Python error: PyEval_RestoreThread: NULL tstate

This application has requested the Runtime to terminate it in an unusual way. Please contact the application's support team for more information.

이제 내 질문에 내가 너무 내 GUI, 음모 몇 가지를 사용하고 있는지 확인 할 수있는 방법이며, 내가 종료 버튼을 누를 경우 GUI 닫히고 전체 프로그램도 닫힙니다.

감사합니다. 최대

답변

2

흠. root.quit()는 항상 오류없이 나를 위해 일했다,하지만 당신을 위해하지 않은 경우 당신이 GUI 및 프로그램 종료, 그래서 아마도이 갈 수있는 가장 좋은 방법입니다 :

root.destroy() 
sys.exit() 
+0

때때로이 코드는 간단합니다. thx! – Max

0

내가 문제가 있었다를 다른 스레드에서 응용 프로그램을 닫으려고 했으므로이 코드를 사용했습니다 (GUI 스레드에서 종료 될 것입니다).

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