python+eric6+pyqt制作一个计时器

做起事情来,忘记时间。想起之前看过的一本书,番茄时钟,工作一段时间,站起来休息一下。现在网上能搜索到很多关于番茄时钟的软件。为了熟悉Pyqt界面开发,自己制作了一个番茄时钟。实现点击开始计时,重新计时,暂停计时,最小化托盘。时间到了,恢复状态。

程序界面

程序界面如下:

《python+eric6+pyqt制作一个计时器》 运行界面.png

运行状态图如下:

《python+eric6+pyqt制作一个计时器》 运行中的状态.png

最小化到托盘状态如下:

《python+eric6+pyqt制作一个计时器》 托盘下的状态.png

有右键菜单,后续可以增加一些实用的菜单,双击托盘图案,还原窗体。

步骤

eric6+pyqt的配置我不多介绍,网上已经很多教程了。

1、使用eric6新建项目,设置好项目属性,项目存放地址

《python+eric6+pyqt制作一个计时器》 项目属性.png

我这里使用python2与pyqt4,读者自行选择符合自己开发的环境。

确定后,eric6会自动生成一个
init.py的空文件

2、制作界面

《python+eric6+pyqt制作一个计时器》 新建窗体.png

《python+eric6+pyqt制作一个计时器》 选择对话框.png

选择新建对话框点确定,选择UI文件存放位置以及UI名称,得到45Timer.ui
右键点击45Timer.ui,选择在QT设计大师中打开

《python+eric6+pyqt制作一个计时器》 设计窗体.png

这里我们用到lcdnumber,pushbutton这两个控件,拖动到主窗体,布局好,设置好图标。最后得到下图:

《python+eric6+pyqt制作一个计时器》 布局好的窗体.png

回到eric6界面,生成对话框代码

《python+eric6+pyqt制作一个计时器》 将窗体生成代码.png

《python+eric6+pyqt制作一个计时器》 点击产生窗体类.png

《python+eric6+pyqt制作一个计时器》 选择生成三个按钮单击事件.png

完成后,在代码界面会出现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_())

写的不够详细,想到哪里写到哪。
总结一下自己的写作,还是比较凌乱的,后续需要改进。

    原文作者:迷途老鹰
    原文地址: https://www.jianshu.com/p/cb88ec10da31
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞