Python GUI和动画

时间:2016-07-13 14:52:08

标签: python user-interface animation matplotlib tkinter

我正在创建一个GUI,用于使用tkinter绘制温度传感器的实时图形,以及使用matplotlib的动画功能。我正在获得漂亮的实时图表。但我面临的问题是,一旦我运行应用程序,实时图表就会启动。我已经创建了一个按钮来调用类StartPage 中的命令,但它不起作用。我希望我的应用程序在单击StartPage中的开始监控时开始收集数据并绘制图表

如果有人可以帮我解决这个问题,那将是一个很大的好处。

Thann You。

def animate(i):

ipcon = IPConnection() # Create IP connection
ptc1 = BrickletPTC(UID1, ipcon) # S3 
ptc2 = BrickletPTC(UID2, ipcon) # S7
ptc3 = BrickletPTC(UID3, ipcon) # S7
ptc4 = BrickletPTC(UID4, ipcon) # S7

ipcon.connect(HOST, PORT) # Connect to brickd
temperature1 = ptc1.get_temperature() - 20
temperature2 = ptc2.get_temperature() + 6
temperature3 = ptc3.get_temperature() + 3
temperature4 = ptc4.get_temperature() + 29

l = [temperature1, temperature2]
avgTemp = np.mean(l)
avgTempM = str(avgTemp/100)

dataArrayavg = avgTempM.split(',')
tempavg = float(dataArrayavg[0])
tempCavg.append(tempavg)
avg.set_xlabel('Time [s]', fontsize = 10)
avg.set_ylabel('Temperature [°C]', fontsize = 10)
y_formatter = matplotlib.ticker.ScalarFormatter(useOffset=False)
avg.yaxis.set_major_formatter(y_formatter)
titleavg = "Average Room Temperature: " + str(temperature1/100) + " °C"
avg.set_title(titleavg, fontsize = 12)
avg.plot(tempCavg, "#483D8B")


f1.savefig('RoomTemperature.png')
f2.savefig('ObjectTemperature.png')


class StartPage(tk.Frame):


def __init__(self, parent, controller):
    tk.Frame.__init__(self, parent)

    # Adding a logo to the startpage
    logo = Image.open("Gemeinschaftslogo(5).jpg")
    Image1 = ImageTk.PhotoImage(logo)

    # defining the image label
    imageLabel = Label(self, image = Image1)
    imageLabel.image = Image1
    imageLabel.pack(pady=30, padx=30)

    #defining labels
    label = ttk.Label(self, text="Zustandsüberwachung (Condition Monitoring) von industriellen Computertomographie-Systemen", font = LARGE_FONT,)
    label.pack(pady=10, padx=10)

    #creating button
    #if agree then move to temperature graph
    button1 = ttk.Button(self, text="Start Monitoring", 
                        command=lambda: animate())  # with lambda we are moving from start page to page 1

    button1.pack(pady=30, padx=30)

    button2 = ttk.Button(self, text="Enter", 
                        command=lambda: controller.show_frame(RoomTempGraph))  # with lambda we are moving from start page to page 1

ani1 = animation.FuncAnimation(f1,animate, interval = 1000)
app.mainloop()

3 个答案:

答案 0 :(得分:0)

好的,脏黑客:

global do_animate
do_animate = False

按如下方式更改命令:

#creating button
#if agree then move to temperature graph
button1 = ttk.Button(self, text="Start Monitoring", 
                    command=lambda: do_animate=True)  # with lambda we are moving from start page to page 1

并在animate中返回if do_animate == False

答案 1 :(得分:0)

类似于Jean-FrançoisFabre的解决方案,这不会阻止你的动画()运行,但它会阻止它做任何事情。

def animate(i):
   global draw
   if draw:
      """ here goes all you want your animate func to do """
   draw = False

因此,通过在if绘图中添加您想要做的内容,您将确保它只会被绘制一次然后不再绘制。如果您希望它继续绘制,最后删除draw = False。根据您的需要,您需要在 init 中设置绘图。

class startpage(tk.Frame):
   def __init__(self, parent, controller):
      global draw
      draw = False #if you want it to start without drawing

至少我是如何在我的程序中使这种事情发挥作用的。你显然需要一种方法在某处将draw设置为true,这可能是任何事情。在我的程序中,每当我改变要绘制的内容时,我都会将其设置为绘制,但您可能需要一个按钮,因为您希望它继续运行。

答案 2 :(得分:0)

刚刚找到了解决自己问题的方法。我希望它可以帮助某人

在app.mainloop()之前我创建了一个测试函数

overflow: hidden

我传递给页面中的命令按钮

app.geometry("1280x720")


def test():

   ani1 = animation.FuncAnimation(f1,animate1, interval = 1000)
   ani2 = animation.FuncAnimation(f2,animate2, interval = 1000)
   ani1._start(test)
   ani2._start(test)

app.mainloop()

我不知道它是如何工作的,但是当我问它时,它会开始绘图......:D

再次感谢大家。 祝你有愉快的一天