Что означает «ошибка сегментации: 11»? Как исправить? - PullRequest
0 голосов
/ 05 января 2019

Я хотел построить некоторые данные, которые обновляются сверхурочно с использованием Tkinter. Перед тем, как начать кодирование, я подумал, что код уже может быть в Google ... и это, конечно. Я нашел простой пример кода на Quora, но когда я запускаю его (из Терминала), окно Tkinter закрывается, и терминал показывает «Ошибка сегментации: 11». Что это значит и как это исправить? У меня MacOS 10.14.2.

Я уже искал ошибку, но не могу ее найти. Код, который я нашел на Quora, с небольшими изменениями, которые я сделал, пока искал ошибку. Полный код от 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 голосов
/ 08 января 2019

Поскольку 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...