python-3.x - “分段错误: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()
解决方案
由于 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()