目录
一.人外有人,天外有天
二.滚动条控件QScrollBar
三.动态显示当前时间
四.让窗口定时关闭
五.使用线程类(QThread)编写计数器
今晚我认识到了自己一个很大缺点,自以为是,我以前总感觉自己有点东西了,现在才知道,原来自己啥也不是,做人,要谦逊,要学会审时夺度,你并不比别人高在哪里!
当你以为你足够吸引对方时,可能对方都没注意你。
此处留一个待解决的问题:如何进行布局的混搭,这个问题下面应该会讲,到时候再来进一步完善代码。
代码:
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
import sys
class ScrollBar(QWidget):
def __init__(self):
super(ScrollBar, self).__init__()
self.initUI()
def initUI(self):
self.setWindowTitle('滚动条控件演示')
self.setGeometry(400,300,300,500)
#水平布局
hbox=QHBoxLayout()
#定义控件
self.label=QLabel('拖动滚动条去改变文字颜色')
self.scrollbar1=QScrollBar() #滚动条
self.scrollbar1.setMaximum(255) #滚动条最大值
#信号与槽
self.scrollbar1.sliderMoved.connect(self.sliderMoved)
self.scrollbar2 = QScrollBar()
self.scrollbar2.setMaximum(255)
self.scrollbar2.sliderMoved.connect(self.sliderMoved)
self.scrollbar3 = QScrollBar()
self.scrollbar3.setMaximum(255)
self.scrollbar3.sliderMoved.connect(self.sliderMoved)
self.scrollbar4 = QScrollBar()
self.scrollbar4.setMaximum(255)
self.scrollbar4.sliderMoved.connect(self.sliderMoved1)
#向布局中添加控件
hbox.addWidget(self.label)
hbox.addWidget(self.scrollbar1)
hbox.addWidget(self.scrollbar2)
hbox.addWidget(self.scrollbar3)
hbox.addWidget(self.scrollbar4)
self.setLayout(hbox)
#获得标签的纵坐标
self.y=self.label.pos().y()
def sliderMoved(self):
print(self.scrollbar1.value(),self.scrollbar2.value(),self.scrollbar3.value())
#调色版
palette=QPalette()
#最后一个参数是透明度
c=QColor(self.scrollbar1.value(),self.scrollbar2.value(),self.scrollbar3.value(),255)
#参数一:QPalette.Foreground设置前景色,即标签的颜色 参数2:颜色
palette.setColor(QPalette.Foreground,c)
self.label.setPalette(palette)
def sliderMoved1(self):
#向下移动标签
self.label.move(self.label.x(),self.y+self.scrollbar4.value())
if __name__=='__main__':
app=QApplication(sys.argv)
main=ScrollBar()
main.show()
sys.exit(app.exec_())
运行结果:
QTimer定时器,适用于多任务,即每隔一定的时间会调用一次
QThread:完成单个任务可以使用这个
多线程:用于同时完成多个任务
代码:
import sys
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
class showTime(QWidget):
def __init__(self,parent=None):
super(showTime, self).__init__(parent)
self.setWindowTitle('动态显示当前时间')
self.label=QLabel('显示当前时间')
self.startBtn=QPushButton('开始')
self.endBtn=QPushButton('结束')
#栅格布局
layout=QGridLayout()
#计时器对象
self.timer=QTimer()
self.timer.timeout.connect(self.showTime)
layout.addWidget(self.label,0,0,1,2)#占一行两列
layout.addWidget(self.startBtn,1,0)
layout.addWidget(self.endBtn, 1, 1)
self.startBtn.clicked.connect(self.startTimer)
self.endBtn.clicked.connect(self.endTimer)
self.setLayout(layout)
def showTime(self):
time=QDateTime.currentDateTime()
#dddd是星期几
timeDispaly=time.toString('yyyy-MM-dd hh:mm:ss dddd')
#将标签设置成当前时间
self.label.setText(timeDispaly)
def startTimer(self):
# 参数是时间间隔,1000毫秒
self.timer.start(1000)
self.startBtn.setEnabled(False) #不能按
self.endBtn.setEnabled(True) #可以按
def endTimer(self):
#停止计时
self.timer.stop()
self.startBtn.setEnabled(True)
self.endBtn.setEnabled(False)
if __name__=='__main__':
app=QApplication(sys.argv)
main=showTime()
main.show()
sys.exit(app.exec_())
运行结果:
代码:
import sys
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
if __name__=='__main__':
app=QApplication(sys.argv)
label=QLabel('Hello World,窗口在5秒后自动关闭!')
#setWindowFlag设置窗口属性:启动画面,无框架
label.setWindowFlags(Qt.SplashScreen | Qt.FramelessWindowHint)
label.show()
#5秒之后退出整个程序
QTimer.singleShot(5000,app.quit)
sys.exit(app.exec_())
运行结果:
使用线程类(QThread) 编写讦数器
QThread
def run(self):
while True:
self. sleep(1)
if sec == 5:
break;
QLCDNumber
WorkThread(QThread)
用到自定义信号,之前用到的信号都是系统已经定义好的,这里需要自己再定义一个。
代码:
import sys
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
#全局变量,当前计数从0开始
sec=0
class WorkThread(QThread): #继承QThread类
# 每隔一秒发送一次信号,pyqtSignal()用来定义信号的
timer=pyqtSignal()
# 计数完成后发送一次信号
end=pyqtSignal()
def run(self):
while True:
self.sleep(1)#休眠一秒
if sec==5:
self.end.emit()#发送end信号,emit()用来发送信号
break
self.timer.emit() #发送timer信号
class Counter(QWidget):
def __init__(self,parent=None):
super(Counter, self).__init__(parent)
self.setWindowTitle('使用线程类(QThread)编写计数器')
self.resize(300,120)
layout=QVBoxLayout() #垂直布局
#数码管
self.lcdNumber=QLCDNumber()
layout.addWidget(self.lcdNumber)
btn=QPushButton('开始计数')
layout.addWidget(btn)
self.workThread=WorkThread()
self.workThread.timer.connect(self.countTime)
self.workThread.end.connect(self.end)
btn.clicked.connect(self.work)
self.setLayout(layout)
def countTime(self):
global sec #声明一下是全局变量
sec+=1
self.lcdNumber.display(sec)
def end(self):
QMessageBox.information(self,'消息','计数结束',QMessageBox.Ok)
def work(self):
self.workThread.start()
if __name__=='__main__':
app=QApplication(sys.argv)
main=Counter()
main.show()
sys.exit(app.exec_())
运行结果: