拿你的程式码改的 请参考
不过我是用PyQt4 所以前面二行要自己改一下
http://ideone.com/Yv9Qi qtimer
作者: KSJ (阿真) 看板: Python
标题: Re: [问题] 定时器范例
时间: Wed Jan 11 19:06:19 2012
※ 引述《wadd (丑男转世-低调)》之铭言:
: 大家好:
: 小弟最近有个困扰
: 我用 PySide 做为 GUI 介面
: 我想要把「开始」跟「停止」的功能做在同一个按键「开始/停止」
: 或者分开做成两颗。
开始跟停止 似乎是互斥的 感觉做一颗也可以
: 目前我的作法是我按下「开始按钮」後
: 他会执行 say_hellow 这个 subroutine
: 我打算在 say_hellow 加上一个 loop 来判断系统时间是否已经到了
: 但我在执行过程中我希望能再按个按键停止闹钟或重新设定时间
: 我发现当我第一次按下「开始按钮」後
: 程式进入了 loop
: 我就无法再按任何按键
: 不知道有什麽比较好的方式可以让我处理这样的事件
因为say_hellow对整个thread是很繁重的任务
简单说就是你按下按钮之後 程式还在等say_hello做完事情
所以视窗就冻住了
有很多方法可以达到你想要的事
一个是使用QprogressDialog 虽然不能多工(也就是不能做除了取消以外的事)
但视窗不会结冻 (还是要看STEP而定)
另外也可以设定QTIMER (这个算时间的其实TIMER还不错用)
用来统计时间到了没
QTIMER是时间到的时候才会触发 没有睡在那 所以并不会冻住画面
Ps. 其实我还没用过QTIMER 等下来试看看...Orz
最後 当然就是QThread
把计时的任务整个交给另一个Thread(称做B吧)
由B发送讯号给A来做gui的展现
由A设定B的变数让B执行完毕
但是就有许多其他的事要考虑了 ( thread-safe dead-lock 之类的)
我觉得你的case蛮适合用qtimer的
: ┌──────────┐
: │ ┌────┐│
: │X时 X秒│开始按钮││
: │ └────┘│
: └──────────┘
: # encoding=utf-8
: # Import PySide classes
: import sys, time
: from PySide.QtCore import *
: from PySide.QtGui import *
: class Form(QDialog):
: def __init__(self, parent=None):
: super(Form, self).__init__(parent)
: # 建立 widgets
: # 设定时间
: self.w_hour = QComboBox()
: self.w_hour.addItems(self.str_range(range(0, 24)))
: self.label3 = QLabel(u'时')
: self.w_minute = QComboBox()
: self.w_minute.addItems(self.str_range(range(0, 60)))
: self.label4 = QLabel(u'分')
: self.button = QPushButton(u'开始')
: # 建立 layout 并加入上面的 widgets
: layout = QHBoxLayout()
: # 设定时间
: layout.addWidget(self.w_hour) # 开始时间:小时
: layout.addWidget(self.label3) # 小时
: layout.addWidget(self.w_minute) # 开始时间:分钟
: layout.addWidget(self.label4) # 分钟
: layout.addWidget(self.button)
: # 设定 dialog layout
: self.setLayout(layout)
: # 设定 dialog 的说明
: self.setWindowTitle('alarm clock')
: # 将 button 事件与 say_hellow slot 连结
: self.button.clicked.connect(self.say_hellow)
: def say_hellow(self):
: print 'push start'
: i = 1
: while(True):
: print i
: i = i+1
: time.sleep(0.5)
: # 将 range 所产生的 list 内容转成 str
: def str_range(self, w_list):
: temp = list()
: for i in w_list:
: temp.append(str(i))
: return temp
: if __name__ == '__main__':
: # 建立 QT 应用程式
: app = QApplication(sys.argv)
: # 建立并显示 form
: form = Form()
: form.show()
: # 执行主要的 QT loop
: sys.exit(app.exec_())
程式码看是不是可以上传贴程式码的网站
有兴趣的人(如我)比较好copy
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 180.176.140.46
※ 编辑: KSJ 来自: 180.176.140.46 (01/11 19:41)
※ 编辑: KSJ 来自: 180.176.140.46 (01/11 19:42)
1F:推 wadd:是的,我就是在找timer,原来写法是这样,非常谢谢K大 01/12 08:58
2F:→ wadd:好,我把这个,让我整理一下,我会再分享出来 01/12 08:59
3F:→ wadd:应该会把K大说的那两种方式都做个sample,抱歉我最近才转高阶 01/12 09:00
4F:→ wadd:思维可能会比较局限点。K 大的程式码可以借我放在 01/12 09:01
6F:→ KSJ:请随意取用 可任意修改 不用附作者没关系 (BSD??)XD 01/12 14:07