在tk app

时间:2016-08-24 18:15:31

标签: python macos matplotlib tk

我在windows和mac处理python tk窗口和matplotlib图形close_event之间遇到了一个非常恼人的区别。

我的问题是,

  1. 我正在尝试从tk按钮事件加载matplotlib图。
  2. 我想要显示图形,并阻止tk UI程序流程 绘图处于活动状态,并捕获用户事件,直到绘图为止 闭合。
  3. 在情节关闭后,tk app应继续。
  4. 显示问题的最小示例应用。

    from Tkinter import *
    from matplotlib import pyplot as plt
    
    
    class Plotter:
        def __init__(self):
            self.fig = plt.figure()
            self.fig.canvas.mpl_connect('close_event', self.dispose)
    
            plt.plot(1, 2, 'r*')
            plt.show()
            print "done with plotter"
    
        def dispose(self, event):
            plt.close('all')
            print "disposed"
    
    
    if __name__ == '__main__':
        def pressed():
            print 'button pressed'
            Plotter()
            print 'YAY'
    
        root = Tk()
        button = Button(root, text='Press', command=pressed)
        button.pack(pady=20, padx=20)
    
        root.mainloop()
    

    可悲的是,我发现这在Windows中可以正常工作,但不能在Mac上使用相同版本的python2.7,matplotlib(1.5.2)。 除了这不是一个好的UI练习之外,令我困扰的是Mac和Windows在这段代码上存在差异。我将不胜感激任何有助于解决此问题的反馈,同时我将开始在非阻塞线程上实现绘图仪,并在关闭时将结果传回主应用程序。

1 个答案:

答案 0 :(得分:1)

您可以使用plt.ion()打开Matplotlib的交互模式,但这本身会导致程序继续运行而不会阻止流程。要手动阻止流,请使用self.fig.canvas.start_event_loop_default()self.fig.canvas.stop_event_loop()暂停程序流,直到捕获事件。

以最小的例子实现:

from Tkinter import *
from matplotlib import pyplot as plt

class Plotter:
    def __init__(self):
        plt.ion()
        self.fig = plt.figure()
        self.fig.canvas.mpl_connect('close_event', self.dispose)
        self.fig.canvas.mpl_connect('button_press_event', self.on_mouse_click)

        plt.plot(1, 2, 'r*')
        plt.show()
        self.fig.canvas.start_event_loop_default()
        print "done with plotter"

    def dispose(self, event):
        self.fig.canvas.stop_event_loop()
        print "disposed"

    def on_mouse_click(self, event):
        print 'mouse clicked!'


if __name__ == '__main__':
    def pressed():
        print 'button pressed'
        Plotter()
        print 'YAY'

root = Tk()
button = Button(root, text='Press', command=pressed)
button.pack(pady=20, padx=20)

root.mainloop()
相关问题