Я пишу скрипт на Python, который визуализирует данные от датчика давления и выполняет временные тесты.Я строю данные на графике Matplotlib в реальном времени, и у меня также есть окно Tkinter для отображения таймера, а также мгновенного показания датчика.Вот последовательность того, о чем я думаю до сих пор:
- Попросите пользователя ввести количество времени для теста в окне Tkinter.Удалите это окно после того, как пользователь введет время
- Создайте график в реальном времени и начните чтение данных
- Откройте окно Tkinter для отображения таймера и мгновенных данных
- Когда тест завершен, утилизируйте Tkinterокно и график.Предложите пользователю ввести количество времени для следующего теста.Повторите шаги 2-4
Вот код, который у меня есть.Я упустил некоторые неважные вещи в интересах экономии места:
#imports
#left out imports to save space
#ADS code
adc = Adafruit_ADS1x15.ADS1115(address=0x48, busnum=1)
GAIN = 1
global t
#ask user for input time
def gettime():
global t
def gettext(self):
global e
global t
string = e.get()
t = int(string)
root.destroy()
root = Tk()
root.geometry("1024x600")
root.title('Enter the time')
root.bind('<KP_Enter>', gettext)
labelfont = ('times', 70, 'bold')
label = Label(root, text="Enter the time:")
label.config(font=labelfont)
label.config(height=3, width=20)
label.pack()
global e
e = Entry(root)
e.pack(ipady=3)
e.focus_set()
root.mainloop()
#create Matplotlib live graph
def makePlot():
# Parameters
x_len = t # Number of points to display
y_range = [0,1] # Range of possible Y values to display
# Create figure for plotting
fig = plt.figure()
mng = plt.get_current_fig_manager()
mng.resize(*mng.window.maxsize())
ax = fig.add_subplot(1, 1, 1)
xs = list(range(0, x_len))
ys = [0] * x_len
ax.set_ylim(y_range)
# Create a blank line. We will update the line in animate
line, = ax.plot(xs, ys)
# Add labels
plt.title('Pressure')
plt.xlabel('Time')
plt.ylabel('Pressure(psi)')
# This function is called periodically from FuncAnimation
def animate(i, ys):
#get value from sensor
x1 = adc.read_adc(0, gain=GAIN)
x2 = ((x1*4.096)/32767.0)*.00176678
# Add y to list
ys.append(x2)
# Limit y list to set number of items
ys = ys[-x_len:]
# Update line with new Y values
line.set_ydata(ys)
return line,
# Set up plot to call animate() function periodically
ani = animation.FuncAnimation(fig,
animate,
fargs=(ys,),
interval=300,
blit=True)
plt.show()
#info panel code
root = Tk()
root.geometry('%dx%d+%d+%d' % (1024, 75, 0, 0))
x1 = adc.read_adc(0, gain=1)
x2 = ((x1*4.096)/32767.0)*.00176678
x3 = '%.3f' % x2
var = x3
labelfont = ('times', 20, 'bold')
label1 = Label(root, text="[Timer]")
label1.pack(side=LEFT)
label2 = Label(root, text=var)
label2.pack(side=LEFT)
label1.config(font=labelfont)
label1.config(height=3, width=35)
label2.config(font=labelfont)
label2.config(height=3, width=35)
def countdown(count):
var2 = "Time", "left:", count
label1.config(text=var2)
if count > 0:
root.after(1000, countdown, count-1)
if count == 0:
var3 = "Test", "ended"
label1.config(text=var3,bg="red")
return
def update():
x1 = adc.read_adc(0, gain=1)
x2 = ((x1*4.096)/32767.0)*.00176678
x3 = '%.3f' % x2
var = "Pressure:", x3, "psi"
label2.config(text=var)
root.after(500, update)
#This is where I am unsure of what to do...
root.after(500, update)
root.mainloop()
Я протестировал все компоненты этого кода, и все они работают по отдельности.Я просто не могу собрать все это вместе.Я предполагаю, что мне нужно будет использовать некоторую сортировку многопоточности, но мне не удалось найти подобные вопросы в Интернете.