【本实验内容】
1.GUI、PyQT5介绍
2.实现此次实验效果
2.实现此次实验效果
【一 GUI、PyQt5介绍】
1.Python简介
![](https://i-blog.csdnimg.cn/blog_migrate/af69a59aeecabe73fee78a7f6f109bc9.png)
2.GUI介绍
几个常用的Python GUI库:
(1)wxPython
(2)tkinter
(3)PyQt5
![](https://i-blog.csdnimg.cn/blog_migrate/3a419693533836b338e6f4e0d478da9a.png)
利用PyQt完成的项目效果展示:
【二 实现此次项目效果】
注意:后面代码都是在前面的基础上添加的;
>>>导入模块:
1 from PyQt5.QtGui import * # QtGui:对系统及窗口的操作
2 from PyQt5.QtCore import * # QtCore:包含一些核心的应用,例如时间模块等;
3 # QDesktopWidget:包含了屏幕的尺寸
4 from PyQt5.QtWidgets import QWidget,QDesktopWidget,QLCDNumber,QVBoxLayout,QApplication
5 import sys
>>>先编写一个闹钟程序的主窗口:
1 # “ADD1” 2 class MyTime(QWidget): 3 """ 4 面向对象的特点:封装、继承、多态---(类、方法、数据) 5 __init__是python语言里面的构造方法 6 """ 7 def __init__(self): 8 # 用于解决多重继承的问题 9 super().__init__() 10 self.initUI() 11 12 # 绘制UI界面 13 def initUI(self): 14 # 窗口组件大小 250px像素 150 15 self.resize(250,150) 16 # self.move(300,300) 17 # 窗口标题: 18 self.setWindowTitle("创意小时钟-香") 19 self.show() 20 # “ADD2” 21 if __name__ == '__main__': 22 # 创建一个QT应用对象 23 app = QApplication(sys.argv) 24 m_time = MyTime() 25 sys.exit(app.exec_()) 26 # app.exex_()
>>> 此时运行程序就可以初步构建一个轮廓了,效果如下:
>>>附截止目前的完整代码如下:
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 from PyQt5.QtGui import * # QtGui:对系统及窗口的操作 2 from PyQt5.QtCore import * # QtCore:包含一些核心的应用,例如时间模块等; 3 # QDesktopWidget:包含了屏幕的尺寸 4 from PyQt5.QtWidgets import QWidget, QDesktopWidget, QLCDNumber, QVBoxLayout, QApplication 5 import sys 6 7 # “ADD1” 8 class MyTime(QWidget): 9 """ 10 面向对象的特点:封装、继承、多态---(类、方法、数据) 11 __init__是python语言里面的构造方法 12 """ 13 14 def __init__(self): 15 # 用于解决多重继承的问题 16 super().__init__() 17 self.initUI() 18 19 # 绘制UI界面 20 21 def initUI(self): 22 # 窗口组件大小 250px像素 150 23 self.resize(250, 150) 24 # self.move(300,300) 25 # 窗口标题: 26 self.setWindowTitle("创意小时钟-香") 27 self.show() 28 29 # “ADD2” 30 if __name__ == '__main__': 31 # 创建一个QT应用对象 32 app = QApplication(sys.argv) 33 m_time = MyTime() 34 sys.exit(app.exec_()) 35 # app.exex_()
窗口名字默认左上角,
可以设置的;
>>>此时,时钟程序没有在正中心,因此进行继续编程解决这个问题:
1 # “ADD2” 2 # 调用 3 self.move_center() # 在initUI()方法的self.show()语句前面增加 4 5 # “ADD1” 6 def move_center(self): 7 # 拿到主窗口的矩形 8 m_rect = self.frameGeometry() 9 # 获得整个屏幕的绝对值,从中得到屏幕的中心点 10 w_center_top = QDesktopWidget().availableGeometry().center() 11 m_rect.moveCenter(w_center_top) 12 # 从左向右边移动,直到屏幕中间的位置 13 self.move(m_rect.topLeft())
>>>现在运行,时钟程序窗口居中了:
>>>附截止目前的完整代码如下:
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 from PyQt5.QtGui import * # QtGui:对系统及窗口的操作 2 from PyQt5.QtCore import * # QtCore:包含一些核心的应用,例如时间模块等; 3 # QDesktopWidget:包含了屏幕的尺寸 4 from PyQt5.QtWidgets import QWidget, QDesktopWidget, QLCDNumber, QVBoxLayout, QApplication 5 import sys, time 6 7 8 class MyTime(QWidget): 9 """ 10 面向对象的特点:封装、继承、多态---(类、方法、数据) 11 __init__是python语言里面的构造方法 12 """ 13 14 def __init__(self): 15 # 用于解决多重继承的问题 16 super().__init__() 17 self.initUI() 18 # 绘制UI界面 19 20 def initUI(self): 21 # 窗口组件大小 250px 150 22 self.resize(250, 150) 23 # self.move(300,300) 24 # 窗口标题: 25 self.setWindowTitle("创意小时钟-香") 26 # 调用 27 self.move_center() # “ADD2” 28 self.show() 29 # “ADD1” 30 def move_center(self): 31 # 拿到主窗口的矩形 32 m_rect = self.frameGeometry() 33 # 获得整个屏幕的绝对值,从中得到屏幕的中心点 34 w_center_top = QDesktopWidget().availableGeometry().center() 35 m_rect.moveCenter(w_center_top) 36 # 从左向右边移动,直到屏幕中间的位置 37 38 39 if __name__ == '__main__': 40 # 创建一个QT应用对象 41 app = QApplication(sys.argv) 42 m_time = MyTime() 43 sys.exit(app.exec_()) 44 # app.exex_()
>>>现在编程里面的LED数字时钟:
1 import time # “ADD1”:增加时间time模块 2 3 # “ADD2 在initUI()方法的self.show()语句后面增加 4 self.lcd = QLCDNumber() 5 # 设置显示的个数 6 self.lcd.setDigitCount(10) 7 # 设置显示的模式为十进制的 8 self.lcd.setMode(QLCDNumber.Dec) 9 # 设置显示的模式为 平面模式 10 self.lcd.setSegmentStyle(QLCDNumber.Flat) 11 # 获取本地时间 12 self.lcd.display(time.strftime("%X", time.localtime())) 13 self.main_layout = QVBoxLayout() 14 # 将显示的组件添加到盒子布局里面 15 self.main_layout.addWidget(self.lcd) 16 # 设置组件在布局的中间位置 17 self.main_layout.setAlignment(Qt.AlignCenter) 18 # 设置给顶层布局 19 self.setLayout(self.main_layout)
>>>附截止目前的完整代码如下:
1 from PyQt5.QtGui import * # QtGui:对系统及窗口的操作 2 from PyQt5.QtCore import * # QtCore:包含一些核心的应用,例如时间模块等; 3 # QDesktopWidget:包含了屏幕的尺寸 4 from PyQt5.QtWidgets import QWidget, QDesktopWidget, QLCDNumber, QVBoxLayout, QApplication 5 import sys,time # “ADD1”:增加时间time模块 6 7 8 9 class MyTime(QWidget): 10 """ 11 面向对象的特点:封装、继承、多态---(类、方法、数据) 12 __init__是python语言里面的构造方法 13 """ 14 15 def __init__(self): 16 # 用于解决多重继承的问题 17 super().__init__() 18 self.initUI() 19 20 # 绘制UI界面 21 22 def initUI(self): 23 # 窗口组件大小 250px像素 150 24 self.resize(250, 150) 25 # self.move(300,300) 26 # 窗口标题: 27 self.setWindowTitle("创意小时钟-香") 28 # 调用 29 self.move_center() 30 self.show() 31 32 # "ADD2 33 self.lcd = QLCDNumber() 34 # 设置显示的个数 35 self.lcd.setDigitCount(10) 36 # 设置显示的模式为十进制的 37 self.lcd.setMode(QLCDNumber.Dec) 38 # 设置显示的模式为 平面模式 39 self.lcd.setSegmentStyle(QLCDNumber.Flat) 40 # 获取本地时间 41 self.lcd.display(time.strftime("%X", time.localtime())) 42 self.main_layout = QVBoxLayout() 43 # 将显示的组件添加到盒子布局里面 44 self.main_layout.addWidget(self.lcd) 45 # 设置组件在布局的中间位置 46 self.main_layout.setAlignment(Qt.AlignCenter) 47 # 设置给顶层布局 48 self.setLayout(self.main_layout) 49 50 def move_center(self): 51 # 拿到主窗口的矩形 52 m_rect = self.frameGeometry() 53 # 获得整个屏幕的绝对值,从中得到屏幕的中心点 54 w_center_top = QDesktopWidget().availableGeometry().center() 55 m_rect.moveCenter(w_center_top) 56 # 从左向右边移动,直到屏幕中间的位置 57 self.move(m_rect.topLeft()) 58 59 if __name__ == '__main__': 60 # 创建一个QT应用对象 61 app = QApplication(sys.argv) 62 m_time = MyTime() 63 sys.exit(app.exec_()) 64 # app.exex_()
>>>现在运行一下,查看结果,但是现在的问题是,时钟上是静态的?
现在解决这个时钟实时更新这个问题。
>>>ADD1 写一个有关定时器的“槽与信号”的函数:
1 def init_timer(self): 2 # 提供了定时器信号和单出发定时器 3 self.timer = QTimer() 4 # 每间隔1秒就出发一次 timeout信号 5 self.timer.setInterval(1000) 6 self.timer.start() # 启动这个定时器 7 self.timer.timeout.connect(self.update_timer) # 信号和槽函数
>>>ADD2写一个输出本地实时时间的函数:
1 def update_timer(self): 2 # 获取本地时间 3 self.lcd.display(time.strftime("%X", time.localtime()))
注意: 删除原来initUI()函数中的此行
# # 获取本地时间
# self.lcd.display(time.strftime("%X", time.localtime()))
>>>ADD3:调用“信号与槽函数”
1 # ADD3: 2 self.init_timer()
>>>现在运行,结果时钟可以实时更新时间了:
>>>附截止目前的完整代码如下:
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 from PyQt5.QtGui import * # QtGui:对系统及窗口的操作 2 from PyQt5.QtCore import * # QtCore:包含一些核心的应用,例如时间模块等; 3 # QDesktopWidget:包含了屏幕的尺寸 4 from PyQt5.QtWidgets import QWidget, QDesktopWidget, QLCDNumber, QVBoxLayout, QApplication 5 import sys,time # “ADD1” 6 7 8 9 class MyTime(QWidget): 10 """ 11 面向对象的特点:封装、继承、多态---(类、方法、数据) 12 __init__是python语言里面的构造方法 13 """ 14 15 def __init__(self): 16 # 用于解决多重继承的问题 17 super().__init__() 18 self.initUI() 19 # ADD3: 20 self.init_timer() 21 # 绘制UI界面 22 # ADD1: 23 def init_timer(self): 24 # 提供了定时器信号和单出发定时器 25 self.timer = QTimer() 26 # 每间隔1秒就出发一次 timeout信号 27 self.timer.setInterval(1000) 28 self.timer.start() # 启动这个定时器 29 self.timer.timeout.connect(self.update_timer) # 信号和槽函数 30 # ADD2: 31 def update_timer(self): 32 # 获取本地时间 33 self.lcd.display(time.strftime("%X", time.localtime())) 34 35 def initUI(self): 36 # 窗口组件大小 250px像素 150 37 self.resize(250, 150) 38 # self.move(300,300) 39 # 窗口标题: 40 self.setWindowTitle("创意小时钟-香") 41 # 调用 42 self.move_center() 43 self.show() 44 45 self.lcd = QLCDNumber() 46 # 设置显示的个数 47 self.lcd.setDigitCount(10) 48 # 设置显示的模式为十进制的 49 self.lcd.setMode(QLCDNumber.Dec) 50 # 设置显示的模式为 平面模式 51 self.lcd.setSegmentStyle(QLCDNumber.Flat) 52 53 # # 获取本地时间 54 # self.lcd.display(time.strftime("%X", time.localtime())) 55 self.main_layout = QVBoxLayout() 56 # 将显示的组件添加到盒子布局里面 57 self.main_layout.addWidget(self.lcd) 58 # 设置组件在布局的中间位置 59 self.main_layout.setAlignment(Qt.AlignCenter) 60 # 设置给顶层布局 61 self.setLayout(self.main_layout) 62 63 def move_center(self): 64 # 拿到主窗口的矩形 65 m_rect = self.frameGeometry() 66 # 获得整个屏幕的绝对值,从中得到屏幕的中心点 67 w_center_top = QDesktopWidget().availableGeometry().center() 68 m_rect.moveCenter(w_center_top) 69 # 从左向右边移动,直到屏幕中间的位置 70 self.move(m_rect.topLeft()) 71 72 if __name__ == '__main__': 73 # 创建一个QT应用对象 74 app = QApplication(sys.argv) 75 m_time = MyTime() 76 sys.exit(app.exec_()) 77 # app.exex_()
发现,它的背景颜色太单调了,这时PyQt5中有一个“调色板”:
>>>ADD1:实例化一个调色板
1 # 实例化一个调色板 2 self.main_pl = QPalette() 3 # 设置背景颜色为深黄色 4 # self.main_pl.setColor(QPalette.Background,Qt.darkRed) 5 self.main_pl.setColor(QPalette.Background, Qt.darkYellow) 6 # 设置窗体自动填充背景颜色 7 self.setAutoFillBackground(True) 8 self.setPalette(self.main_pl)
>>> 现在运行,查看结果:
>>>附截止目前的完整代码如下:
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 from PyQt5.QtGui import * # QtGui:对系统及窗口的操作 2 from PyQt5.QtCore import * # QtCore:包含一些核心的应用,例如时间模块等; 3 # QDesktopWidget:包含了屏幕的尺寸 4 from PyQt5.QtWidgets import QWidget, QDesktopWidget, QLCDNumber, QVBoxLayout, QApplication 5 import sys,time # “ADD1” 6 7 8 9 class MyTime(QWidget): 10 """ 11 面向对象的特点:封装、继承、多态---(类、方法、数据) 12 __init__是python语言里面的构造方法 13 """ 14 15 def __init__(self): 16 # 用于解决多重继承的问题 17 super().__init__() 18 self.initUI() 19 self.init_timer() 20 # 绘制UI界面 21 22 def init_timer(self): 23 # 提供了定时器信号和单出发定时器 24 self.timer = QTimer() 25 # 每间隔1秒就出发一次 timeout信号 26 self.timer.setInterval(1000) 27 self.timer.start() # 启动这个定时器 28 self.timer.timeout.connect(self.update_timer) # 信号和槽函数 29 30 def update_timer(self): 31 # 获取本地时间 32 self.lcd.display(time.strftime("%X", time.localtime())) 33 34 def initUI(self): 35 # 窗口组件大小 250px像素 150 36 self.resize(250, 150) 37 # self.move(300,300) 38 # 窗口标题: 39 self.setWindowTitle("创意小时钟-香") 40 # 调用 41 self.move_center() 42 # ADD1:实例化一个调色板 43 # 实例化一个调色板 44 self.main_pl = QPalette() 45 # 设置背景颜色为深黄色 46 # self.main_pl.setColor(QPalette.Background,Qt.darkRed) 47 self.main_pl.setColor(QPalette.Background, Qt.darkYellow) 48 # 设置窗体自动填充背景颜色 49 self.setAutoFillBackground(True) 50 self.setPalette(self.main_pl) 51 52 self.show() 53 self.lcd = QLCDNumber() 54 # 设置显示的个数 55 self.lcd.setDigitCount(10) 56 # 设置显示的模式为十进制的 57 self.lcd.setMode(QLCDNumber.Dec) 58 # 设置显示的模式为 平面模式 59 self.lcd.setSegmentStyle(QLCDNumber.Flat) 60 61 # # 获取本地时间 62 # self.lcd.display(time.strftime("%X", time.localtime())) 63 self.main_layout = QVBoxLayout() 64 # 将显示的组件添加到盒子布局里面 65 self.main_layout.addWidget(self.lcd) 66 # 设置组件在布局的中间位置 67 self.main_layout.setAlignment(Qt.AlignCenter) 68 # 设置给顶层布局 69 self.setLayout(self.main_layout) 70 71 def move_center(self): 72 # 拿到主窗口的矩形 73 m_rect = self.frameGeometry() 74 # 获得整个屏幕的绝对值,从中得到屏幕的中心点 75 w_center_top = QDesktopWidget().availableGeometry().center() 76 m_rect.moveCenter(w_center_top) 77 # 从左向右边移动,直到屏幕中间的位置 78 self.move(m_rect.topLeft()) 79 80 if __name__ == '__main__': 81 # 创建一个QT应用对象 82 app = QApplication(sys.argv) 83 m_time = MyTime() 84 sys.exit(app.exec_()) 85 # app.exex_()
>>>最后此项目的完整代码如下:
1 from PyQt5.QtGui import * # QtGui:对系统及窗口的操作 2 from PyQt5.QtCore import * # QtCore:包含一些核心的应用,例如时间模块等; 3 # QDesktopWidget:包含了屏幕的尺寸 4 from PyQt5.QtWidgets import QWidget,QDesktopWidget,QLCDNumber,QVBoxLayout,QApplication 5 import sys,time 6 7 8 class MyTime(QWidget): 9 """ 10 面向对象的特点:封装、继承、多态---(类、方法、数据) 11 __init__是python语言里面的构造方法 12 """ 13 def __init__(self): # self指的是类实例对象的本身(PS:不是类本身) 14 # 用于解决多重继承的问题 15 super().__init__() 16 self.initUI() 17 self.init_timer() 18 def init_timer(self): 19 # 提供了定时器信号和单出发定时器 20 self.timer = QTimer() 21 # 每间隔1秒就出发一次 timeout信号 22 self.timer.setInterval(1000) 23 self.timer.start() # 启动这个定时器 24 self.timer.timeout.connect(self.update_timer) # 信号和槽函数 25 def update_timer(self): 26 # 获取本地时间 27 self.lcd.display(time.strftime("%X", time.localtime())) 28 29 30 31 # 绘制UI界面 32 def initUI(self): 33 # 窗口组件大小 250px 150 34 self.resize(250,150) 35 # self.move(300,300) 36 # 窗口标题: 37 self.setWindowTitle("创意小时钟-香") 38 # 调用 39 self.move_center() 40 41 # 实例化一个调色板 42 self.main_pl = QPalette() 43 # 设置背景颜色为深黄色 44 # self.main_pl.setColor(QPalette.Background,Qt.darkRed) 45 self.main_pl.setColor(QPalette.Background, Qt.darkYellow) 46 # 设置窗体自动填充背景颜色 47 self.setAutoFillBackground(True) 48 self.setPalette(self.main_pl) 49 50 # 字体颜色的设置:这里有问题: 51 # self.main_pl = QPalette() 52 # self.main_pl.setColor(QPalette.Normal, QPalette.windowText,Qt.darkBlue) 53 # self.setAutoFillBackground(True) 54 # self.setPalette(self.main_pl) 55 56 # 显示布局 57 self.show() 58 59 self.lcd = QLCDNumber() 60 # 设置显示的个数 61 self.lcd.setDigitCount(10) 62 # 设置显示的模式为十进制的 63 self.lcd.setMode(QLCDNumber.Dec) 64 # 设置显示的模式为 平面模式 65 self.lcd.setSegmentStyle(QLCDNumber.Flat) 66 # 实例化盒子布局 67 self.main_layout = QVBoxLayout() 68 # 将显示的组件添加到盒子布局里面 69 self.main_layout.addWidget(self.lcd) 70 # 设置组件在布局的中间位置 71 self.main_layout.setAlignment(Qt.AlignCenter) 72 # 设置给顶层布局 73 self.setLayout(self.main_layout) 74 75 def move_center(self): 76 # 拿到主窗口的矩形 77 m_rect = self.frameGeometry() 78 # 获得整个屏幕的绝对值,从中得到屏幕的中心点 79 w_center_top = QDesktopWidget().availableGeometry().center() 80 m_rect.moveCenter(w_center_top) 81 # 从左向右边移动,直到屏幕中间的位置 82 self.move(m_rect.topLeft()) 83 if __name__ == '__main__': 84 # 创建一个QT应用对象 85 app = QApplication(sys.argv) 86 m_time = MyTime() 87 sys.exit(app.exec_()) 88 # app.exex_()
The end!
**************************************************************************************************
Good lucky to you
**************************************************************************************************