2017-07-02 81 views
-2

我有一个Raspberry pi并使用Python我已经编写了一个GUI来控制使用PWM的风扇,并从风扇脉冲输出中计算出RPM。 GUI在顶部有一个标签,用于选择不同占空比的按钮,用于显示选择哪个按钮的LED标志指示器,用于'停止风扇','退出','显示RPM'的按钮。如何在Python中创建一个不断更新的标签

我使用“启动风扇”按钮启动风扇。然后我可以选择不同的工作周期。当我点击'Display RPM'按钮时,GUI顶部的标签显示RPM(小数点后面有很多数字),它只是RPM的快照。我的代码运行正常。

我的问题是这样的。我如何让标签不断显示变化的RPM?我想删除“显示RPM”按钮,只需标签始终显示实时更改的RPM。 我已经搜索了几个小时的帮助,并尝试'之后','函数调用'等,但我似乎无法掌握我需要做什么或代码中应该去哪里。

非常感谢您的时间和帮助。 该代码可能不是我所知道的最好的,但我正在学习。我会很乐意接受有关如何改进它的任何建议。

# Fan PWM Control 
import time 
from time import sleep 
import piface.pfio as pfio 
pfio.init() 

import RPi.GPIO as GPIO 
GPIO.setmode(GPIO.BOARD) 
GPIO.setup(7,GPIO.OUT) 
GPIO.setup(18,GPIO.IN,pull_up_down=GPIO.PUD_UP) 
my_pwm = GPIO.PWM(7,1000) 
last_time = time.time() 
this_time = time.time() 
RPM = 0 


from Tkinter import * 

import Tkinter as tk 

a=0 

class App: 

    def __init__(self, master): 
      self.master=master 
      frame = Frame(master) 
      frame.pack() 

      self.TACHO = Label(frame, text=RPM) 
      self.TACHO.grid(row=0, column=0) 

      self.button0 = Button(frame, text='Start Fan', command=self.convert0) 
      self.button0.grid(row=2, column=0) 
      self.LED0 = Label(frame, image=logo2) 
      self.LED0.grid(row=2, column=1) 

      self.button1 = Button(frame, text='Fan 30% Duty Cycle', command=self.convert1) 
      self.button1.grid(row=3, column=0) 
      self.LED1 = Label(frame, image=logo2) 
      self.LED1.grid(row=3, column=1) 

      self.button2 = Button(frame, text='Fan 45% Duty Cycle', command=self.convert2) 
      self.button2.grid(row=4, column=0) 
      self.LED2 = Label(frame, image=logo2) 
      self.LED2.grid(row=4, column=1) 

      self.button3 = Button(frame, text='Fan 60% Duty Cycle', command=self.convert3) 
      self.button3.grid(row=5, column=0) 
      self.LED3 = Label(frame, image=logo2) 
      self.LED3.grid(row=5, column=1) 

      self.button4 = Button(frame, text='Fan 75% Duty Cycle', command=self.convert4) 
      self.button4.grid(row=6, column=0) 
      self.LED4 = Label(frame, image=logo2) 
      self.LED4.grid(row=6, column=1) 

      self.button5 = Button(frame, text='Fan 90% Duty Cycle', command=self.convert5) 
      self.button5.grid(row=7, column=0) 
      self.LED5 = Label(frame, image=logo2) 
      self.LED5.grid(row=7, column=1) 

      self.button6 = Button(frame, text='Fan 100% Duty Cycle', command=self.convert6) 
      self.button6.grid(row=8, column=0) 
      self.LED6 = Label(frame, image=logo2) 
      self.LED6.grid(row=8, column=1) 

      self.button7 = Button(frame, text='STOP FAN', command=self.convert7) 
      self.button7.grid(row=9, column=0) 

      self.button8 = Button(frame, text='Exit', command=self.convert8) 
      self.button8.grid(row=10, column=0) 


      self.button9 = Button(frame, text='Display RPM', command=self.Tach) 
      self.button9.grid(row=11, column=0) 


    def convert0(self): 

      print('Fan 15% Duty Cycle') 
      global a 
      a = 1 
      self.button0.config(text='Fan 15% Duty Cycle') 
      self.LED0.config(image = logo) 
      my_pwm.start(15) 
      pfio.digital_write(0,1) #turn on 
      self.LED1.config(image = logo2) 
      self.LED2.config(image = logo2) 
      self.LED3.config(image = logo2) 
      self.LED4.config(image = logo2) 
      self.LED5.config(image = logo2) 
      self.LED6.config(image = logo2) 
      pfio.digital_write(1,0) #turn off 
      pfio.digital_write(2,0) #turn off 
      pfio.digital_write(3,0) #turn off 
      pfio.digital_write(4,0) #turn off 
      pfio.digital_write(5,0) #turn off 
      pfio.digital_write(6,0) #turn off 
      pfio.digital_write(7,0) #turn off 


    def convert1(self): 

     if a==0: 

      print('Please Start the Fan') 

     else: 

      print('Fan 30% Duty Cycle') 
      self.button1.config(text='Fan 30% Duty Cycle') 
      self.LED1.config(image = logo) 
      my_pwm.ChangeDutyCycle(30) 
      pfio.digital_write(1,1) #turn on 
      self.LED0.config(image = logo2) 
      self.LED2.config(image = logo2) 
      self.LED3.config(image = logo2) 
      self.LED4.config(image = logo2) 
      self.LED5.config(image = logo2) 
      self.LED6.config(image = logo2) 
      pfio.digital_write(0,0) #turn off 
      pfio.digital_write(2,0) #turn off 
      pfio.digital_write(3,0) #turn off 
      pfio.digital_write(4,0) #turn off 
      pfio.digital_write(5,0) #turn off 
      pfio.digital_write(6,0) #turn off 
      pfio.digital_write(7,0) #turn off 

    def convert2(self): 

     if a==0: 

      print('Please Start the Fan') 

     else: 

      print('Fan 45% Duty Cycle') 
      self.button2.config(text='Fan 45% Duty Cycle') 
      self.LED2.config(image = logo) 
      my_pwm.ChangeDutyCycle(45) 
      pfio.digital_write(2,1) #turn on 
      self.LED0.config(image = logo2) 
      self.LED1.config(image = logo2) 
      self.LED3.config(image = logo2) 
      self.LED4.config(image = logo2) 
      self.LED5.config(image = logo2) 
      self.LED6.config(image = logo2) 
      pfio.digital_write(0,0) #turn off 
      pfio.digital_write(1,0) #turn off 
      pfio.digital_write(3,0) #turn off 
      pfio.digital_write(4,0) #turn off 
      pfio.digital_write(5,0) #turn off 
      pfio.digital_write(6,0) #turn off 
      pfio.digital_write(7,0) #turn off 

    def convert3(self): 

     if a==0: 

      print('Please Start the Fan') 

     else: 

      print('Fan 60% Duty Cycle') 
      self.button3.config(text='Fan 60% Duty Cycle') 
      self.LED3.config(image = logo) 
      my_pwm.ChangeDutyCycle(60) 
      pfio.digital_write(3,1) #turn on 
      self.LED0.config(image = logo2) 
      self.LED1.config(image = logo2) 
      self.LED2.config(image = logo2) 
      self.LED4.config(image = logo2) 
      self.LED5.config(image = logo2) 
      self.LED6.config(image = logo2) 
      pfio.digital_write(0,0) #turn off 
      pfio.digital_write(1,0) #turn off 
      pfio.digital_write(2,0) #turn off 
      pfio.digital_write(4,0) #turn off 
      pfio.digital_write(5,0) #turn off 
      pfio.digital_write(6,0) #turn off 
      pfio.digital_write(7,0) #turn off 

    def convert4(self): 

     if a==0: 

      print('Please Start the Fan') 

     else: 

      print('Fan 75% Duty Cycle') 
      self.button4.config(text='Fan 75% Duty Cycle') 
      self.LED4.config(image = logo) 
      my_pwm.ChangeDutyCycle(75) 
      pfio.digital_write(4,1) #turn on 
      self.LED0.config(image = logo2) 
      self.LED1.config(image = logo2) 
      self.LED2.config(image = logo2) 
      self.LED3.config(image = logo2) 
      self.LED5.config(image = logo2) 
      self.LED6.config(image = logo2) 
      pfio.digital_write(0,0) #turn off 
      pfio.digital_write(1,0) #turn off 
      pfio.digital_write(2,0) #turn off 
      pfio.digital_write(3,0) #turn off 
      pfio.digital_write(5,0) #turn off 
      pfio.digital_write(6,0) #turn off 
      pfio.digital_write(7,0) #turn off 

    def convert5(self): 

     if a==0: 

      print('Please Start the Fan') 

     else: 

      print('Fan 90% Duty Cycle') 
      self.button5.config(text='Fan 90% Duty Cycle') 
      self.LED5.config(image = logo) 
      my_pwm.ChangeDutyCycle(90) 
      pfio.digital_write(5,1) #turn on 
      self.LED0.config(image = logo2) 
      self.LED1.config(image = logo2) 
      self.LED2.config(image = logo2) 
      self.LED3.config(image = logo2) 
      self.LED4.config(image = logo2) 
      self.LED6.config(image = logo2) 
      pfio.digital_write(0,0) #turn off 
      pfio.digital_write(1,0) #turn off 
      pfio.digital_write(2,0) #turn off 
      pfio.digital_write(3,0) #turn off 
      pfio.digital_write(4,0) #turn off 
      pfio.digital_write(6,0) #turn off 
      pfio.digital_write(7,0) #turn off 

    def convert6(self): 

     if a==0: 

      print('Please Start the Fan') 

     else: 

      print('Fan 100% Duty Cycle') 
      self.button6.config(text='Fan 100% Duty Cycle') 
      self.LED6.config(image = logo) 
      my_pwm.ChangeDutyCycle(100) 
      pfio.digital_write(6,1) #turn on 
      self.LED0.config(image = logo2) 
      self.LED1.config(image = logo2) 
      self.LED2.config(image = logo2) 
      self.LED3.config(image = logo2) 
      self.LED4.config(image = logo2) 
      self.LED5.config(image = logo2) 
      pfio.digital_write(0,0) #turn off 
      pfio.digital_write(1,0) #turn off 
      pfio.digital_write(2,0) #turn off 
      pfio.digital_write(3,0) #turn off 
      pfio.digital_write(4,0) #turn off 
      pfio.digital_write(5,0) #turn off 
      pfio.digital_write(7,0) #turn off 

    def convert7(self): 


      print('STOP FAN') 
      global a 
      a = 0 
      self.button7.config(text='STOP FAN') 
      my_pwm.stop() 
      pfio.digital_write(7,1) #turn on 
      self.LED0.config(image = logo2) 
      self.LED1.config(image = logo2) 
      self.LED2.config(image = logo2) 
      self.LED3.config(image = logo2) 
      self.LED4.config(image = logo2) 
      self.LED5.config(image = logo2) 
      self.LED6.config(image = logo2) 
      self.button0.config(text='Start Fan') 
      pfio.digital_write(0,0) #turn off 
      pfio.digital_write(1,0) #turn off 
      pfio.digital_write(2,0) #turn off 
      pfio.digital_write(3,0) #turn off 
      pfio.digital_write(4,0) #turn off 
      pfio.digital_write(5,0) #turn off 
      pfio.digital_write(6,0) #turn off 


    def convert8(self): 


      print('EXIT PROGRAM') 
      my_pwm.stop() 
      quit() 

    def EventsPerTime(self): 
     global RPM, this_time, last_time 
     if GPIO.input(self) > 0.5: 
      this_time = time.time() 
      RPM = (1/(this_time - last_time))*30 
      last_time = this_time 
      #print 'RPM is %d' % RPM 



    GPIO.add_event_detect(18, GPIO.RISING, callback=EventsPerTime, bouncetime=3) 


    def Tach(self): 
     global RPM 
     if RPM > 1: 
      print 'RPM is %d' % RPM 
      self.TACHO.config(text=RPM) 




root = Tk() 
logo2 = PhotoImage(file="/home/pi/Off LED.gif") 
logo = PhotoImage(file="/home/pi/Red LED.gif") 


root.wm_title('FAN PWM Control program') 
app = App(root) 

root.mainloop() 
+0

如果您已经从'EventsPerTime'定期安排了RPM,那么是什么阻止您更新标签? –

+0

我最初尝试使用我的谷歌结果之一。我的事情是self.Tach()。但是如果这是正确的选择,我就无法实现它。 –

+1

请制作[mcve]。如果您的问题是显示RPM,则不需要与RPM显示无关的所有代码。 –

回答

0

这里是我的代码更改用于在我的Raspberry Pi上显示RPM的PWM GUI控件。由于良好的反馈和通过这篇文章和网站的帮助,我设法让程序运行并实现我的目标。该代码可能没有那么好或有效,因此请随时提供改进建议。

感谢您的帮助和分享知识。

 #self.button9 = Button(frame, text='Display RPM', command=self.Tach) Stopped using this button 
     #self.button9.grid(row=11, column=0) Stopped using this button 

     self.TimerInterval = 500 #This sets the time interval between RPM readings 
     self.Tach()   #This will start the 'Tach' method when the GUI starts 

def convert0(self): 

我也写为其中所用的“后”功能设定的间隔之后,将调用一个给定的功能“塔克”的方法。所以我把它设置为每500mS自动调用一次。

def Tach(self): 
    print 'RPM is %d' % RPM 
    self.TACHO.config(text='RPM is %d' % RPM) 
    self.master.after(self.TimerInterval,self.Tach) #Used 'after' to repeat this method at the time interval 

我不知道如何停止'后'功能,但我会去那,并一路学习。

1

您已经拥有了一个获取当前RPM的函数。最简单的事情就是在那里更新标签:

def EventsPerTime(self): 
    global RPM, this_time, last_time 
    if GPIO.input(self) > 0.5: 
     ... 
     RPM = (1/(this_time - last_time))*30 
     ... 

     self.TACHO.configure(text=RPM) 

问题的另一个部分是,您错误地指定了回拨。您需要更改此代码:

GPIO.add_event_detect(..., callback=EventsPerTime, ...) 

这样:

GPIO.add_event_detect(..., callback=self.EventsPerTime, ...) 

您还可以重新定义EventsPerTIme接受一个额外的参数:

def EventsPerTime(self, channel): 
    ... 
+0

我试过了,但出现错误 - AttributeError:'int'对象没有属性'TACHO'。 –

+0

@blast_uk:您的问题中的代码无法提供该错误。您必须将“self.TACHO”重新定义为某个整数。 –

+0

这是我得到的错误,但是我同意你说的话,我只是看不到它。我一直在看'时间',RPM计算等。 –

相关问题