Запуск окна Tkinter и графика Matplotlib одновременно - PullRequest
0 голосов
/ 25 октября 2018

Я пишу скрипт на Python, который визуализирует данные от датчика давления и выполняет временные тесты.Я строю данные на графике Matplotlib в реальном времени, и у меня также есть окно Tkinter для отображения таймера, а также мгновенного показания датчика.Вот последовательность того, о чем я думаю до сих пор:

  1. Попросите пользователя ввести количество времени для теста в окне Tkinter.Удалите это окно после того, как пользователь введет время
  2. Создайте график в реальном времени и начните чтение данных
  3. Откройте окно Tkinter для отображения таймера и мгновенных данных
  4. Когда тест завершен, утилизируйте 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() 

Я протестировал все компоненты этого кода, и все они работают по отдельности.Я просто не могу собрать все это вместе.Я предполагаю, что мне нужно будет использовать некоторую сортировку многопоточности, но мне не удалось найти подобные вопросы в Интернете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...