2013-07-08 17 views
7

xem xét chạy đoạn mã sau (lưu ý nó là một phiên bản cực kỳ đơn giản để chứng minh vấn đề):Tkinter/Matplotlib backend xung đột gây mainloop vô hạn

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() 

Đóng cửa sổ đầu tiên sẽ hoạt động tốt, nhưng đóng cửa sổ thứ hai làm cho mã bị treo, vì root.mainloop() gây ra một vòng lặp vô hạn. Vấn đề này là do gọi số fig = plot.figure(figsize=(16.8, 8.0)). Có ai biết làm thế nào để có được gốc để đóng thành công sau khi thực hiện cuộc gọi matplotlib.pyplot?

+2

'pyplot' cũng bắt đầu lên đó là vòng lặp chính mà tôi nghi ngờ là vấn đề của bạn. Xem http://matplotlib.org/examples/user_interfaces/ để biết cách nhúng mpl vào gui theo lựa chọn của bạn – tacaswell

+0

Có cách nào để buộc đóng một vòng chính pyplot không? Vấn đề ảnh hưởng đến tất cả các cửa sổ tkinter sau sau cuộc gọi pyplot, ngay cả trong các mô-đun khác nhau. – TheoretiCAL

Trả lời

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() 

Khi nhúng một con số matplotlib bên trong một cửa sổ Tkinter, sử dụng matplotlib.figure.Figure hơn plt.Figure.

+0

Câu trả lời của tôi vẫn đứng - đặc biệt là sử dụng 'matplotlib.figure.Figure' thay vì' plt.Figure'. Chỉ riêng thay đổi đó sẽ làm cho mã của bạn hoạt động. – unutbu

+0

Mát mẻ rằng một dòng là những gì tôi cần, bạn có thể giải thích sự khác biệt phụ trợ giữa matplotlib.figure.Figure và plt.Figure vì nó áp dụng cho mainloop? Cảm ơn! – TheoretiCAL

+6

'plt.figure' sử dụng trình quản lý hình để sắp xếp lại phần tử mainloop/gui ect. 'matplotlib.figure.Figure' chỉ là một đối tượng' Hình' và đó là vấn đề của bạn để sắp xếp lại gui. – tacaswell