<div dir="ltr"><div>Hello,Dave, thank you very much for helping me, I am so sorry for replying later, I did the hardware of my project in these days.</div><div> </div><div>According to your hints, I changed my code, but when I click the start button, the program is dead, no any response. The following is my code.</div>
<div>import sys<br>from PyQt4 import QtGui<br>from PyQt4 import QtCore<br>import time<br>import functools</div><div><br>class Example(QtGui.QWidget):</div><div>    def __init__(self):<br>        super(Example, self).__init__()</div>
<div>        self.initUI()</div><div><br>    def initUI(self):<br>        <br>        startbtn = QtGui.QPushButton('Start', self)<br>        startbtn.setToolTip('Click it to <b>start</b> the program')<br>
        startbtn.clicked.connect(self.newtime)<br>        startbtn.resize(startbtn.sizeHint())<br>        startbtn.move(200, 340)</div><div>        nowtime = '0000-00-00 00:00:00'<br>        self.timeEdit = QtGui.QLabel(str(nowtime),self)<br>
        self.timeEdit.move(110,30)<br>                   <br>        qbtn = QtGui.QPushButton('Quit', self)<br>        qbtn.setToolTip('Click it and <b>quit</b> the program')<br>        qbtn.clicked.connect(QtCore.QCoreApplication.instance().quit)<br>
        qbtn.resize(qbtn.sizeHint())<br>        qbtn.move(400, 340)</div><div><br>        self.setGeometry(300, 200, 600, 400)<br>        self.setWindowTitle('Battery status')    <br>        self.show()</div><div>
<br>    def newtime(self):<br>        while True:<br>            nowtime = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())<br>            self.timeEdit.setText(str(nowtime))</div><div>def main():<br>    <br>    app = QtGui.QApplication(sys.argv)<br>
    ex = Example()<br>    sys.exit(app.exec_())</div><div><br>if __name__ == '__main__':<br>    main()</div><div> </div><div>If I remove 'while True:',it can work, but only show the local time, how to fix the loop.</div>
<div> </div><div>Thank you in advance.</div><div>Best regards</div><div>Harry</div></div><div class="gmail_extra"><br><br><div class="gmail_quote">2013/8/1 David Hoese <span dir="ltr"><<a href="mailto:dhoese@gmail.com" target="_blank">dhoese@gmail.com</a>></span><br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">The way a timer works, especially the singleShot you are using, is that once it is time to act it calls the function pointer you've provided. You *must* provide a callable. Every tick of the timer is just calling that callable with no parameters. You could provide a function pointer to a function that will never return, but I think this will block your GUI event loop (see below). I'd have to test it myself, but don't really have the time right now, sorry.<br>

<br>
If I understand you correctly, what you would like to happen is:<br>
1. User clicks "Start"<br>
2. newtime is called<br>
3. newtime "creates" a new value<br>
4. The time label (or other widget) gets updated with this new value<br>
<br>
If you are just updating the time based on a certain interval, use a QTimer without the singleShot, similar to what you are doing in your example.<br>
<br>
If updating a time is just an example in the code you've provided and you would like to update a value I would suggest still using a QTimer or using threads (QThread). It depends on why your "newtime" function needs to be a long running loop that never returns.<br>

<br>
If it is a long running loop that never returns because it continuously updates the values, then you could change newtime to be "per iteration", use QTimers, and call newtime every "tick" of the timer. So go from a function like this:<br>

<br>
    def newtime(self):<br>
        i = 0<br>
        while True:<br>
            timeEdit.setText(str(i))<br>
            i += 1<br>
<br>
to:<br>
<br>
    def newtime(self):<br>
        timeEdit.setText(str(self.i))<br>
        self.i += 1<br>
<br>
If your loop is long running because it blocks on system IO (network communications, file reading, database, etc.) then you should use QThreads. Any type of long running code that runs in the main/GUI thread will block your GUI and the user won't be able to interact. I suggest researching PyQt Event loops, QThreads, and after that read <a href="http://blog.qt.digia.com/blog/2010/06/17/youre-doing-it-wrong/" target="_blank">http://blog.qt.digia.com/blog/<u></u>2010/06/17/youre-doing-it-<u></u>wrong/</a><br>

I've posted on this mailing list before helping users with their QThread problems, if you look those up they may help.<br>
<br>
Let me know what you decide to do and hopefully this rambling made sense.<br>
<br>
-Dave<div class="im"><br>
<br>
On 7/31/2013 7:10 PM,  wrote:<br>
</div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;padding-left:1ex;border-left-color:rgb(204,204,204);border-left-width:1px;border-left-style:solid"><div class="im">
Hi, Dave, thank you very much for helping me. I am a newcomer to pyqt4,<br>
so maybe my questions are low-level.Thanks again. If the function does<br>
not have returns, can the button connect the function? The newtime<br>
function realizes a loop to change the time every 1s, there is no<br>
return. I want to click the 'start' button to begin the function, how to<br>
realize that?<br>
Thanks in advance<br>
-Harry<br>
<br>
<br></div>
2013/7/31 David Hoese <<a href="mailto:dhoese@gmail.com" target="_blank">dhoese@gmail.com</a> <mailto:<a href="mailto:dhoese@gmail.com" target="_blank">dhoese@gmail.com</a>>><div class="im"><br>
<br>
    Hi Harry,<br>
<br>
    There are a couple missing things in your program. First, if you<br>
    read the exception you notice the line of the error and some<br>
    information about what's happening. The message you are getting is<br>
    saying that the argument to "connect" is not callable (meaning a<br>
    function or method or object with a __call__ method). If you look at<br>
    that line you'll see you are calling your "newTime" function and<br>
    passing what it returns. Instead what you want is to pass the<br>
    function itself. Right above that you use a lambda which will work,<br>
    but I would recommend using the functools.partial function:<br></div>
    <a href="http://docs.python.org/2/__library/functools.html#__functools.partial" target="_blank">http://docs.python.org/2/__<u></u>library/functools.html#__<u></u>functools.partial</a> <<a href="http://docs.python.org/2/library/functools.html#functools.partial" target="_blank">http://docs.python.org/2/<u></u>library/functools.html#<u></u>functools.partial</a>><div class="im">
<br>
<br>
    You will want to remove the timer call that you have right before<br>
    declaring the button (line 19) otherwise the timer starts before the<br>
    "Start" button is clicked.<br>
<br>
    I think you could also use a QTimer without doing a singleShot, but<br>
    what you have works.<br>
<br>
    Please CC me in any replies. Good luck.<br>
<br>
    -Dave<br>
<br>
<br></div>
    On 7/31/13 6:00 AM, pyqt-request@__<a href="http://riverbankcomputing.com" target="_blank">riverbankcomput<u></u>ing.com</a><div class="im"><br>
    <mailto:<a href="mailto:pyqt-request@riverbankcomputing.com" target="_blank">pyqt-request@<u></u>riverbankcomputing.com</a>> wrote:<br>
<br>
        Hi,all, I want to use a button to control when the program start<br>
        in pyqt4,<br>
        in other words, when I press the start button, the program will<br>
        work. I<br>
        wrote some code, but it doesn't work. please help me to correct<br>
        it. Thanks<br>
        in advance.<br>
<br>
        Best regards<br>
        Harry<br>
<br>
        import sys<br>
        from PyQt4 import QtGui<br>
        from PyQt4 import QtCore<br>
        import time<br>
<br>
        class Example(QtGui.QWidget):<br>
              def __init__(self):<br>
                  super(Example, self).__init__()<br>
                  self.initUI()<br>
<br>
              def initUI(self):<br>
<br>
                  nowtime = '0000-00-00 00:00:00'<br></div>
                  timeEdit = QtGui.QLabel(str(nowtime),__<u></u>self)<br>
                  timeEdit.resize(timeEdit.__<u></u>sizeHint())<br>
                  timeEdit.move(110,30)<br>
<br>
<br>
          QtCore.QTimer.singleShot(1000,<u></u>__lambda:self.newtime(<u></u>timeEdit))<div class="im"><br>
<br>
                  startbtn = QtGui.QPushButton('Start', self)<br>
                  startbtn.setToolTip('Click it to <b>start</b> the<br>
        program')<br></div>
                  startbtn.clicked.connect(self.<u></u>__newtime(timeEdit))<br>
                  startbtn.resize(startbtn.__<u></u>sizeHint())<div class="im"><br>
                  startbtn.move(200, 340)<br>
<br>
                  qbtn = QtGui.QPushButton('Quit', self)<br>
                  qbtn.setToolTip('Click it and <b>quit</b> the program')<br>
<br></div>
          qbtn.clicked.connect(QtCore.__<u></u>QCoreApplication.instance().__<u></u>quit)<div class="im"><br>
                  qbtn.resize(qbtn.sizeHint())<br>
                  qbtn.move(400, 340)<br>
<br>
                  self.setGeometry(300, 200, 600, 400)<br>
                  self.setWindowTitle('Battery status')<br>
                  self.show()<br>
<br>
              def newtime(self,timeEdit):<br>
                  nowtime = time.strftime('%Y-%m-%d %H:%M:%S',<br>
        time.localtime())<br>
                  timeEdit.setText(str(nowtime))<br>
<br></div>
          QtCore.QTimer.singleShot(1000,<u></u>__lambda:self.newtime(<u></u>timeEdit))<div class="im"><br>
<br>
        def main():<br>
<br>
              app = QtGui.QApplication(sys.argv)<br>
              ex = Example()<br>
              sys.exit(app.exec_())<br>
<br>
        if __name__ == '__main__':<br>
              main()<br>
<br>
        *when executing the program, there is something wrong:*<br>
        **<br>
        *Traceback (most recent call last):<br>
<br>
            File "C:\Python\calendar.py", line 62, in <module><br>
              main()<br>
            File "C:\Python\calendar.py", line 57, in main<br>
              ex = Example()<br>
            File "C:\Python\calendar.py", line 15, in __init__<br>
              self.initUI()<br>
            File "C:\Python\calendar.py", line 32, in initUI<br></div>
              startbtn.clicked.connect(self.<u></u>__newtime(timeEdit))<div class="im"><br>
        TypeError: connect() slot argument should be a callable or a<br>
        signal, not<br>
        'NoneType'*<br>
<br>
<br>
<br>
</div></blockquote>
</blockquote></div><br></div>