[prev in list] [next in list] [prev in thread] [next in thread] 

List:       pykde
Subject:    Re: [PyQt] How to change the value which is shown on GUI
From:       "Johoski, Timothy R" <timothy.r.johoski () intel ! com>
Date:       2013-07-28 0:15:45
Message-ID: 6A6C81C6EE0AD649BEC0D14FB78818CD6B81DE03 () ORSMSX107 ! amr ! corp ! intel ! com
[Download RAW message or body]

hi Harry,

At the end of the updateLabel() function, it calls QTimer.singleShot to ensure that \
Qt will call updateLabel again in another 5 seconds.  So, the sequence of operations \
                is something like this:
  - at the bottom of the file, the main function is called
  - main calls initUI
  - initUI constructs the widgets and calls QTimer.singleShot to schedule updateLabel \
                to be called in 5 seconds
  - initUI returns back to main
  - main calls QApplication.exec_ to bring up the gui
  - QApplication.exec_ enters a loop to process mouse, button, key, and timer events
  - after 5 seconds, the QTimer expires and Qapplication's event loop calls \
                updateLabel
  - updateLabel checks the voltage, current temperature, etc and updates the gui as \
                appropriate
  - updateLabel calls QTimer.singleShot to schedule updateLabel to be called in \
                another 5 seconds
  - control returns back to Qapplication's event loop and it processes mouse, button, \
key, and timer events again...  and after 5 seconds, the timer expires and calls \
updateLabel again.  and so on...

So, in essence, the updateLabel function is equivalent to your while True loop, it \
ensures that updateLabel is called every 5 seconds.  If you have other values like \
current temperature, etc, I recommend updating those values in the updateLabel \
function.  Hope this answers your questions..  Good luck.

- Tim



From: 吉文 [mailto:jiwen0304@gmail.com] 
Sent: Friday, July 26, 2013 2:54 PM
To: Johoski, Timothy R
Cc: pyqt@riverbankcomputing.com
Subject: Re: [PyQt] How to change the value which is shown on GUI

Hi, Tim, Thank you very much for helping me, I will try it tomorrow. If there is \
other value such as current, temperature etc. , this value like the voltage, is also \
the real changing data, how to realize this function? Calling updateLabel() many \
times?  
One more question, the voltage will change in every 5 seconds, i.e. raspberrypi will \
receive the value of voltage every 5 seconds, can I write the code like the \
following.   
while True:
          QtCore.QTimer.singleShot(5000, lambda: self.updateLabel(voltageEdit))
 
Thanks in advance
Best regards
Harry

2013/7/26 Johoski, Timothy R <timothy.r.johoski@intel.com>
> From: pyqt-bounces@riverbankcomputing.com \
>                 [mailto:pyqt-bounces@riverbankcomputing.com] On Behalf Of ??
> Sent: Friday, July 26, 2013 9:45 AM
> To: pyqt@riverbankcomputing.com
> Subject: [PyQt] How to change the value which is shown on GUI
> 
> Hello list, I want to design a battery monitoring system via raspberrypi. The \
> voltage of battery is real changing data, I try to write some code, but the voltage \
> can not change when I change the value of voltage. 
> here is part of my code:
> 
> import sys
> from PyQt4 import QtGui,QtCore
> import time
> 
> class Example(QtGui.QWidget):
> 
> def __init__(self):
> super(Example,self).__init__()
> 
> self.initUI()
> 
> def initUI(self):
> voltage=12 #e.g. I get the value of voltage is 12v
> 
> voltageEdit=QtGui.QLabel(str(voltage),self)
> voltageEdit.resize(voltageEdit.sizeHint())
> voltageEdit.move(160,100)
> 
> time.sleep(5) # I want the GUI shows another value of voltage 5 seconds later
> 
> voltage=22
> voltageEdit=QtGui.QLabel(str(voltage),self)
> voltageEdit.resize(voltageEdit.sizeHint())
> voltageEdit.move(160,100)
> 
> grid=QtGui.QGridLayout()
> self.setLayout(grid)
> 
> self.setGeometry(300,200,600,400)
> self.setWindowTitle("battery status")
> self.show()
> 
> def main():
> 
> app=QtGui.QApplication(sys.argv)
> ex=Example()
> sys.exit(app.exec())
> 
> if __name__='__main__':
> main()
> 
> 
> When I executed this code, GUI shows the voltage is 12, and it will not change, \
> please tell me how to fix it. 
> thanks in advance,
> 
> Harry
hi Harry, the following illustrates how to update the label every 5 seconds using a \
QTimer.  In the original code, time.sleep(5) will actually put the application to \
sleep and Qt will not process any events (mouse motion, button presses, repaint \
events, etc).  But in the code below, QTimer.singleShot "schedules" the updateLabel \
function to be called in 5 seconds.  QTimer.singleShot returns immediately, allowing \
the next lines of code to run and show the widget on the screen.  5 seconds later, Qt \
calls updateLabel which changes the voltage text (and then schedules another call to \
itself 5 more seconds from now). Hope this helps.
- Tim

import sys
from PyQt4 import QtGui,QtCore
import time

class Example(QtGui.QWidget):

        def __init__(self):
              super(Example,self).__init__()

              self.initUI()

        def initUI(self):
              voltage=12 #e.g. I get the value of voltage is 12v

              voltageEdit=QtGui.QLabel(str(voltage),self)
              voltageEdit.resize(voltageEdit.sizeHint())
              voltageEdit.move(160,100)
              # after 5 seconds (5000 milliseconds), call self.updateLabel
              QtCore.QTimer.singleShot(5000, lambda: self.updateLabel(voltageEdit))

              grid=QtGui.QGridLayout()
              self.setLayout(grid)

              self.setGeometry(300,200,600,400)
              self.setWindowTitle("battery status")
              self.show()
        def updateLabel(self, voltageEdit):
              # change the following line to retrieve the new voltage from the device
              newvoltage=int(voltageEdit.text()) + 1
              voltageEdit.setText(str(newvoltage))
              QtCore.QTimer.singleShot(5000, lambda: self.updateLabel(voltageEdit))

def main():

         app=QtGui.QApplication(sys.argv)
         ex=Example()
         sys.exit(app.exec_())

if __name__=='__main__':
         main()

_______________________________________________
PyQt mailing list    PyQt@riverbankcomputing.com
http://www.riverbankcomputing.com/mailman/listinfo/pyqt


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic