为了账号安全,请及时绑定邮箱和手机立即绑定

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

标签:
Python

做起事情来,忘记时间。想起之前看过的一本书,番茄时钟,工作一段时间,站起来休息一下。现在网上能搜索到很多关于番茄时钟的软件。为了熟悉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


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消