“分段错误:11”是什么意思?怎么修?

时间:2019-01-05 07:39:38

标签: python-3.x macos matplotlib tkinter

我想绘制一些使用Tkinter随时间更新的数据。在开始编码之前,我认为该代码可能已经在Google上了……当然。我在Quora上找到了一个简单的示例代码,但是当我从终端运行它时,Tkinter窗口关闭,终端显示“ Segmentation fault:11”。这是什么意思,以及如何解决?我有MacOS 10.14.2。

我已经搜索了该错误,但是找不到它。该代码是我在Quora上找到的,其中包含我在寻找bug时所做的微小更改。 Quora的完整代码可以在以下位置找到: https://www.quora.com/How-do-I-create-a-real-time-plot-with-matplotlib-and-Tkinter

from tkinter import *
from random import randint

from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
from matplotlib.figure import Figure
import time
import threading

continuePlotting = False

def change_state():
    # Pause or resume live plot

    global continuePlotting

    if continuePlotting == True:
        continuePlotting = False
    else:
        continuePlotting = True

def data_points():
    f = open('data.txt', 'w')
    for i in range(10):
        f.write(str(randint(0,10)) + '\n')
    f.close()

    f = open('data.txt', 'r')
    data = f.readlines()
    f.close()

    l = []
    for i in range(len(data)):
        l.append(data[i])
    return l

def app():

    root = Tk()
    root.config(background='white')
    root.geometry('1000x700')

    lab = Label(root, text='Live Plotting', bg='white').pack()

    fig = Figure()

    ax = fig.add_subplot(111)
    ax.set_xlabel('X axis')
    ax.set_ylabel('Y axis')
    ax.grid()


    graph = FigureCanvasTkAgg(fig, master=root)
    graph.get_tk_widget().pack(side='top', fill='both', expand=True)

    def plotter():
        while continuePlotting:
            ax.cla()
            ax.grid()

            dpts = data_points()

            ax.plot(range(10), dpts, marker='o', color='orange')
            graph.draw()
            time.sleep(1)

    def gui_handler():
        change_state()
        threading.Thread(target=plotter).start()

    b = Button(root, text='Start/stop', command=gui_handler)
    b.pack()

    root.mainloop()

if __name__=='__main__':
    app()

1 个答案:

答案 0 :(得分:0)

由于tkinter不是线程安全的,因此最好使用.after()而不是线程。如下重写plotter()gui_handler()

def plotter():
    if continuePlotting:
        ax.cla()
        ax.grid()
        dpts = data_points()
        ax.plot(range(10), dpts, marker='o', color='orange')
        graph.draw()
        root.after(1000, plotter)

def gui_handler():
    change_state()
    plotter()