2013-07-08 15 views
7

Rozważmy uruchomiony następujący kod (zauważ, że jest to bardzo uproszczona wersja do wykazania problem):Tkinter/matplotlib backend konflikt powoduje nieskończoną MainLoop

import matplotlib.pyplot as plot 
from tkinter import * #Tkinter if your on python 2 

def main(): 

    fig = plot.figure(figsize=(16.8, 8.0)) 

    root = Tk() 
    w = Label(root, text="Close this and it will hang!") 
    w.pack() 
    root.mainloop() 

    print('Code never reaches this point') 

if __name__ == '__main__': 
    main() 

Zamknięcie pierwszego okna będzie działać dobrze, ale zamykając drugie okno powoduje zawieszenie kodu, ponieważ root.mainloop() powoduje nieskończoną pętlę. Ten problem jest spowodowany wywołaniem fig = plot.figure(figsize=(16.8, 8.0)). Czy ktoś wie, jak uzyskać root, aby zamknąć pomyślnie po wykonaniu tej rozmowy matplotlib.pyplot?

+2

'Pyplot' również uruchamia swój własny mainloop, który podejrzewam, że jest twoim problemem. Zobacz http://matplotlib.org/examples/user_interfaces/, jak osadzić mpl w gui do wyboru – tacaswell

+0

Czy istnieje sposób na wymuszenie zamknięcia pętli głównej pyplot? Problem dotyczy wszystkich następujących okien tkinter po wywołaniu pyplot, nawet w różnych modułach. – TheoretiCAL

Odpowiedz

7
import matplotlib 
from tkinter import * 

def main(): 

    fig = matplotlib.figure.Figure(figsize=(16.8, 8.0)) 

    root = Tk() 
    w = Label(root, text="Close this and it will not hang!") 
    w.pack() 
    root.mainloop() 

    print('Code *does* reach this point') 

if __name__ == '__main__': 
    main() 

Podczas osadzania postać matplotlib wewnątrz okna Tkinter użyć matplotlib.figure.Figure zamiast plt.Figure.

+0

Moja odpowiedź nadal jest ważna - szczególnie przy użyciu 'matplotlib.figure.Figure' zamiast' plt.Figure'. Ta sama zmiana sprawi, że twój kod będzie działał. – unutbu

+0

Cool, że jedna linia była tym, czego potrzebowałem, czy mógłbyś wyjaśnić różnicę między backendem matplotlib.figure.Figure i plt.Figure, jak ma to zastosowanie do mainloopa? Dzięki! – TheoretiCAL

+6

'plt.figure' używa menedżera rysunku do wywarcia mainloop/gui ect. 'matplotlib.figure.Figure' jest po prostu obiektem' Figure' i jest twoim problemem, aby spierać się z gui. – tacaswell

Powiązane problemy