目录

PythonPyQt5教程(三)电子钟案例

一、前言:

  • 我们在前面学习了一些使用PyQt5开发的相关知识,
  • 本次我们将实现一个简单的电子时钟来加强python的编码能力及PyQt5相关开发知识的使用。
  • 本次我们主要用到两个新的知识点:

1、QTimer

  • 描述:
  • QTimer类提供了定时器信号和单触发定时器。
  • 它在内部使用定时器事件来提供更通用的定时器。
  • 使用操作:创建一个QTimer,使用start来开始并且把它的timeout()连接到适当的槽。当这段时间过去了,它将会发射timeout()信号。

2、QLCDNumber

  • 描述:
  • 用于显示LCD数字。它可以显示几乎任意大小的数字。可以显示十进制、十六进制、八进制或二进制数。使用display()槽连接到数据源。

二、编码实战

  • OK,我们先来看下本次的效果图吧。 http://upload-images.jianshu.io/upload_images/1811893-b5320147b4408c98.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240

  • 我们先来看下完整的代码,然后再分段来讲解。

  • 代码不多,50行不到哦。

      from PyQt5.QtGui import *
      from PyQt5.QtCore import *;
      from PyQt5.QtWidgets import (QWidget,QDesktopWidget,QLCDNumber,QVBoxLayout,QApplication)
      import time,sys
      class MyTime(QWidget):
    
      	def __init__(self):
      		super(MyTime,self).__init__();
      		self.initUI();
      		self.init_timer();
    
      	def update_time(self):
      		self.lcd.display(time.strftime('%X',time.localtime()))
    
      	def init_timer(self):
      		self.timer = QTimer();
      		self.timer.setInterval(1000);
      		self.timer.start();
      		self.timer.timeout.connect(self.update_time);
    
      	def initUI(self):
      		self.resize(200,200);
      		self.setWindowTitle('时钟');
      		self.move_center();
    
      		self.main_p = QPalette();
      		self.main_p.setColor(QPalette.Background,Qt.darkYellow);
      		self.setAutoFillBackground(True);
      		self.setPalette(self.main_p);
    
      		self.lcd = QLCDNumber();
      		self.lcd.setDigitCount(10);
      		self.lcd.setMode(QLCDNumber.Dec);
      		self.lcd.setSegmentStyle(QLCDNumber.Flat);
    
      		self.lcd_p = QPalette();
      		self.lcd_p.setColor(QPalette.Normal,QPalette.WindowText,Qt.black)
      		self.lcd.setPalette(self.lcd_p)
    
      		self.lcd.display(time.strftime('%X',time.localtime()))
    
      		self.main_layout = QVBoxLayout();
      		self.main_layout.addWidget(self.lcd);
      		self.main_layout.setAlignment(Qt.AlignCenter);
      		self.setLayout(self.main_layout);
    
      	def move_center(self):
      		m_rect= self.frameGeometry();
      		w_rect = QDesktopWidget().availableGeometry();
      		w_center_point =  w_rect.center();
      		m_rect.moveCenter(w_center_point);
      		self.move(m_rect.topLeft());
    
      if __name__=='__main__':
      	app = QApplication(sys.argv);
      	m_timer = MyTime();
      	m_timer.show();
      	sys.exit(QApplication.exec_());
    

代码详解:

  • 1、首先我们继承QWidget来创建一个自定义时钟类。
  • 2、在initUI方法里完成界面的编写。
  • 3、在init_timer方法里完成有关时钟的初始化。

我们看下initUI里面的代码:

  • 设置大小那些我们就不讲了,本次我们还多了一个类QPalette,我们通过它来设置组件的背景颜色及字体的背景颜色等。
背景颜色的设置
  • self.main_p = QPalette();:创建一个QPalette类,其相当于调色板
  • self.main_p.setColor(QPalette.Background,Qt.darkYellow); :设置背景颜色为darkYellow
  • self.setAutoFillBackground(True); :设置窗体自动填充背景颜色
  • self.setPalette(self.main_p);:把调色板设置给我们的顶级窗口就可以了哦。这样背景颜色就设置好了。
LCD显示组件的设置
  • self.lcd = QLCDNumber();创建一个QLCDNumber
  • self.lcd.setDigitCount(10); 设置显示数字个数
  • self.lcd.setMode(QLCDNumber.Dec);设置显示模式为十进制
  • self.lcd.setSegmentStyle(QLCDNumber.Flat);:设置样式为平面模式
  • 再下来是一段设置里面字体颜色的,与背景颜色类似,我就不说了 显示时间:
  • self.lcd.display(time.strftime(’%X’,time.localtime()))
  • time.strftime():接收时间元组,并返回以可读字符串表示的当地时间,格式由参数format决定。
  • %X 表示显示本地相应的时间表示
  • time.localtime()获取本地时间。
  • self.main_layout = QVBoxLayout(); 创建一个盒子布局
  • self.main_layout.addWidget(self.lcd);把我们的显示组件添加到布局中。
  • self.main_layout.setAlignment(Qt.AlignCenter);:设置组件在布局的中心
  • self.setLayout(self.main_layout);:设置给我们的顶层布局
电子钟的初始化
  • 我们再看下init_timer方法
  • self.timer = QTimer();:创建一个定时器
  • self.timer.setInterval(1000);:设置定时器每1秒触发一次timeout信号
  • self.timer.start();:启动定时器
  • self.timer.timeout.connect(self.update_time);:timeout信号与update_time方法关联,再timeout触发时,通知我们的update_time.再update_time里更新显示的时间。

三、总结

  • 本次我们学习了QTimer的使用、QLCDNumber的显示、还增加了背景颜色、字体颜色的设置等。
  • 后面我们将一点一点增加复杂度,循序渐进。