首页 > 解决方案 > “分段错误:11”是什么意思?怎么修?

问题描述

我想绘制一些使用 Tkinter 超时更新的数据。在开始编码之前,我认为该代码可能已经在 Google 上......当然是。我在 Quora 上找到了一个简单的示例代码,但是当我(从终端)运行它时,Tkinter 窗口关闭并且终端显示“分段错误: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()

标签: python-3.xmacosmatplotlibtkinter

解决方案


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

推荐阅读