做起事情来,忘记时间。想起之前看过的一本书,番茄时钟,工作一段时间,站起来休息一下。现在网上能搜索到很多关于番茄时钟的软件。为了熟悉Pyqt界面开发,自己制作了一个番茄时钟。实现点击开始计时,重新计时,暂停计时,最小化托盘。时间到了,恢复状态。
程序界面
程序界面如下:
运行状态图如下:
最小化到托盘状态如下:
有右键菜单,后续可以增加一些实用的菜单,双击托盘图案,还原窗体。
步骤
eric6+pyqt的配置我不多介绍,网上已经很多教程了。
1、使用eric6新建项目,设置好项目属性,项目存放地址
我这里使用python2与pyqt4,读者自行选择符合自己开发的环境。
确定后,eric6会自动生成一个init.py的空文件
2、制作界面
选择新建对话框点确定,选择UI文件存放位置以及UI名称,得到45Timer.ui
右键点击45Timer.ui,选择在QT设计大师中打开
这里我们用到lcdnumber,pushbutton这两个控件,拖动到主窗体,布局好,设置好图标。最后得到下图:
回到eric6界面,生成对话框代码
完成后,在代码界面会出现45Timer.py文件,里面是实现控件功能代码区。
点击编译所有窗体生成Ui_45Timer.py文件,里面是关于窗体界面代码区
3、实现功能代码
我们首先把窗体的最大化去掉,只保留小化和关闭
在Ui_45Timer.py的主类下加入如下代码:
MainWindow.setWindowFlags(QtCore.Qt.Window|QtCore.Qt.WindowMinimizeButtonHint)
其他功能的实现直接上代码,代码里面有很详细的注释
45Timer.py
INICIO = 2700
class MainWindow(QMainWindow, Ui_MainWindow):
"""
Class documentation goes here.
"""
def __init__(self, parent=None):
"""
Constructor
@param parent reference to the parent widget
@type QWidget
"""
QMainWindow.__init__(self, parent)
self.setupUi(self)
# 设置托盘图标及菜单
self.trayIcon = QtGui.QSystemTrayIcon(self)
self.trayIcon.setIcon(QtGui.QIcon(':/icon/Time_32px.png'))
self.trayIcon.setToolTip(u'番茄时钟')
self.trayIcon.activated.connect(self.trayClick)
trayMenu = QtGui.QMenu(QtGui.QApplication.desktop())
exitAction = trayMenu.addAction(u'退出')
exitAction.triggered.connect(self.exit)
self.trayIcon.setContextMenu(trayMenu)
# 设置倒计时时长
self.timer = QtCore.QTimer()
text = "%d:%02d" % (2700/60,2700 % 60)
self.lcdNumber.display(text)
self.timer.timeout.connect(self.updateTimerDisplay)
# 开始
@pyqtSignature("")
def on_pushButton_clicked(self):
"""
Slot documentation goes here.
"""
# TODO: not implemented yet
# icon = QtGui.QIcon()
# icon.addPixmap(QtGui.QPixmap((":/icon/pause_524px.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off)
# self.pushButton.setIcon(icon)
# 设置播放按钮为不可用
self.pushButton.setEnabled(False)
# 设置暂停键可用
self.pushButton_2.setEnabled(True)
# self.inicio = INICIO
self.timer.start(1000)
def updateTimerDisplay(self):
global INICIO
INICIO -= 1
text = "%d:%02d" % (INICIO/60, INICIO % 60)
text = self.lcdNumber.display(text)
if INICIO == 0:
self.timer.stop()
# todo
# 时间到了之后,播放按键恢复,时间恢复。
INICIO = 2700
text = "%d:%02d" % (INICIO/60, INICIO % 60)
text = self.lcdNumber.display(text)
self.pushButton.setEnabled(True)
self.trayIcon.hide()
self.showNormal()
# 暂停
@pyqtSignature("")
def on_pushButton_2_clicked(self):
self.pushButton_2.setEnabled(False)
self.pushButton.setEnabled(True)
self.timer.stop()
@pyqtSignature("")
# 重置
def on_pushButton_3_clicked(self):
global INICIO
INICIO = 2700
self.pushButton_2.setEnabled(True)
text = "%d:%02d" % (INICIO/60, INICIO % 60)
text = self.lcdNumber.display(text)
self.timer.start(1000)
def changeEvent(self, event):
'''改变事件'''
# 判断是否为最小化事件
if event.type() == QtCore.QEvent.WindowStateChange and self.isMinimized():
# 设置隐藏窗体
self.setWindowFlags(self.windowFlags() & ~QtCore.Qt.Tool)
# 显示托盘图标
self.trayIcon.show()
def exit(self):
# 不设置Visible为False,退出后TrayIcon不会刷新
self.trayIcon.setVisible(False)
sys.exit(0)
def closeEvent(self, event):
reply = QtGui.QMessageBox.question(self,
u'警告!', u'你是否真的退出?',
QtGui.QMessageBox.Yes | QtGui.QMessageBox.No,
QtGui.QMessageBox.No)
if reply == QtGui.QMessageBox.Yes:
event.accept()
else:
self.trayIcon.show()
self.hide()
event.ignore()
# self.trayIcon.setVisible(False)
# sys.exit(0)
def trayClick(self, reason):
if reason == QtGui.QSystemTrayIcon.DoubleClick:
self.trayIcon.hide()
self.showNormal()
if __name__ == "__main__":
import sys
app = QtGui.QApplication(sys.argv)
dlg = MainWindow()
dlg.show()
sys.exit(app.exec_())
写的不够详细,想到哪里写到哪。
总结一下自己的写作,还是比较凌乱的,后续需要改进。