做起事情来,忘记时间。想起之前看过的一本书,番茄时钟,工作一段时间,站起来休息一下。现在网上能搜索到很多关于番茄时钟的软件。为了熟悉Pyqt界面开发,自己制作了一个番茄时钟。实现点击开始计时,重新计时,暂停计时,最小化托盘。时间到了,恢复状态。
程序界面
程序界面如下:
运行界面.png
运行状态图如下:
运行中的状态.png
最小化到托盘状态如下:
托盘下的状态.png
有右键菜单,后续可以增加一些实用的菜单,双击托盘图案,还原窗体。
步骤
eric6+pyqt的配置我不多介绍,网上已经很多教程了。
1、使用eric6新建项目,设置好项目属性,项目存放地址
项目属性.png
我这里使用python2与pyqt4,读者自行选择符合自己开发的环境。
确定后,eric6会自动生成一个init.py的空文件
2、制作界面
新建窗体.png
选择对话框.png
选择新建对话框点确定,选择UI文件存放位置以及UI名称,得到45Timer.ui
右键点击45Timer.ui,选择在QT设计大师中打开
设计窗体.png
这里我们用到lcdnumber,pushbutton这两个控件,拖动到主窗体,布局好,设置好图标。最后得到下图:
布局好的窗体.png
回到eric6界面,生成对话框代码
将窗体生成代码.png
点击产生窗体类.png
选择生成三个按钮单击事件.png
完成后,在代码界面会出现45Timer.py文件,里面是实现控件功能代码区。
点击编译所有窗体生成Ui_45Timer.py文件,里面是关于窗体界面代码区
3、实现功能代码
我们首先把窗体的最大化去掉,只保留小化和关闭
在Ui_45Timer.py的主类下加入如下代码:
MainWindow.setWindowFlags(QtCore.Qt.Window|QtCore.Qt.WindowMinimizeButtonHint)
其他功能的实现直接上代码,代码里面有很详细的注释
45Timer.py
INICIO = 2700class 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_())
写的不够详细,想到哪里写到哪。
总结一下自己的写作,还是比较凌乱的,后续需要改进。
作者:迷途老鹰
链接:https://www.jianshu.com/p/cb88ec10da31