2014-11-26 2 views
1

Я знаю, что в одном направлении есть много потоков, но я не смог найти решение. Многие потоки собираются закрыть графический интерфейс, но все еще работают с кодом python, и этого я не хочу. Но см. Мой вопрос ниже:Выход из tkinter gui без ошибок

В настоящее время я использую Python 2.7 и Windows 7. Я разрабатываю программу, которая анализирует мои данные, которые я читаю с датчика. После завершения моей программы python я замораживаю ее с помощью cx_freeze, чтобы выполнить ее на ПК без python или без matplotlib и т. Д. .... Проблема, с которой я столкнулась, заключается в том, что я хочу добавить кнопку закрытия, которая закрывает мое приложение. Проблема заключается в том, что я попробовал 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(). Проблема в том, что если я использую третью кнопку, графический интерфейс закрывается, но программа все еще работает? У меня также есть выход из mainloop, но я думал, что я выхожу из mainloop с помощью root.quit()?

Другие 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, сюжет некоторые вещи и так далее, и если я нажимаю кнопку бросить курить, графический интерфейс закрывается, и вся программа закрывается тоже?

Большое спасибо! Макс.

ответ

2

Хм. root.quit() всегда работал для меня без ошибок, но если это не для вас, возможно, это лучший способ пойти, так что вы закрыть графический интерфейс и программа:

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

иногда это просто это просто :) ТНХ! – Max

0

У меня была проблема, когда я пытались закрыть приложение из другого потока, поэтому я использовал этот код, (он будет вызывать выход из GUI потоке)

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