根据前面我们所讲述的内容,先创建PyCharm工程项目,然后创建Qt工程项目,在Qt工程项目中设计界面并创建资源文件。
界面中我们只放置一个“关闭”按钮,所以在此不做具体的描述。下面,我们创建资源文件。
在Qt Creator中选择“File” ->"New File or Project...",然后选择“Qt”->"Qt Resource File",在File name中输入res,在项目中可以看到,我们创建了一个res.qrc资源文件。
在资源文件上右击,选择”Open in Editor“即可打开资源文件编辑器。
在资源文件中首先需要创建一个前缀,名称可以根据具体的资源进行命名,我们在此处命名为:icons;然后单击”Add Files“,选择事先准备好的图标文件添加进来。
在按钮的属性编辑器中找到icon属性,点击下拉菜单中的”Choose Resource...“,在对话框中选择对应的资源文件中的图标即可。
编译资源文件:
在PyCharm的工程项目中创建一个名为rcc.bat的批处理文件,其代码如下:
注意:编译资源文件时,生成的py文件名结尾必须是_rc,因为编译窗体文件后会产生如下语句:
编译窗体文件:
在PyCharm的工程项目中创建一个名为uic.bat的批处理文件,其代码如下:
运行以上两个批处理文件,可以看到编译后的py文件已经生成。
执行程序后可以看到,界面中的关闭按钮显示了我们在Qt Creator中设置的图标。
引入图标类:
在主程序中app = QApplication(sys.argv)语句后面增加设置图标的代码:
为”关闭“按钮添加单击事件代码:
运行程序即可看到应用程序的图标也可以显示了。
有很多种方法,但是很多方法要么这个有问题,要么那个有问题,最后终于找到一种没问题的方法。记录一下:Login.py(登录窗口)文件
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import *
from PyQt5.QtWidgets import QFileDialog, QMessageBox, QDockWidget, QListWidget
from PyQt5.QtGui import *
from Ui_Login import Ui_Login_Window #由.UI文件生成.py文件后,导入创建的GUI类
from Main import * # Main.py为 主窗口代码文件
from class_MSSQL import MSSQL
#QtWidgets.QMainWindow:继承该类方法
class Login_window(QtWidgets.QMainWindow,Ui_Login_Window):
#__init__: 析构函数,也就是类被创建后就会预先加载的项目。
# 马上运行,这个方法可以用来对你的对象做一些你希望的初始化。
def __init__(self):
#这里需要重载一下Login_window,同时也包含了QtWidgets.QMainWindow的预加载项。
super(Login_window, self).__init__()
self.setupUi(self)
# 将点击事件与槽函数进行连接
self.btn_login.clicked.connect(self.btn_login_fuc)
#登录按钮 函数
def btn_login_fuc(self):
#1 获取输入的账户和密码
account = self.txt_1.text() # 记得text要打括号()!
password = self.txt_2.text()
if account == "" or password == "":
reply = QMessageBox.warning(self,"警告","账号密码不能为空,请输入!")
return
#2 查询数据库,判定是否有匹配
ms = MSSQL()
result = ms.Login_result(account, password)
if(len(result) >0):
#1打开新窗口
Ui_Main.show()#2关闭本窗口
self.close()
else:
reply = QMessageBox.warning(self,"警告","账户或密码错误,请重新输入!")
if __name__ == '__main__': #如果这个文件是主程序。
app = QtWidgets.QApplication(sys.argv) #QApplication相当于main函数,也就是整个程序(很多文件)的主入口函数。对于GUI程序必须至少有一个这样的实例来让程序运行。
window = Login_window() #生成一个实例(对象)
Ui_Main = Ui_Main() #生成主窗口的实例
window.show() #有了实例,就得让它显示。这里的show()是QWidget的方法,用来显示窗口。
sys.exit(app.exec_()) # 调用sys库的exit退出方法,条件是app.exec_()也就是整个窗口关闭。
Main.py(主窗口)文件
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from Ui_Main import Ui_MainWindow #由.UI文件生成.py文件后,导入创建的GUI类
import math
from PIL import Image, ImageDraw, ImageFont
import numpy as np
import os
import cv2 as cvcv
from class_Detection import Detection
class Ui_Main(QtWidgets.QMainWindow,Ui_MainWindow):
def __init__(self):
super(Ui_Main, self).__init__()
self.setupUi(self)
# 将点击事件与槽函数进行连接
self.btn_video.clicked.connect(self.btn_video_fuc)
def btn_video_fuc(self):
filename = QFileDialog.getOpenFileName(self,'open file','./')
self.timer_camera = QTimer(self)
self.cap = cvcv.cv2.VideoCapture(filename[0])
self.timer_camera.timeout.connect(self.show_pic)
self.timer_camera.start(10) #1毫秒
def show_pic(self):
dc = Detection()
success,frame = self.cap.read()
if success:
show = dc.process_image(frame)
showImage = QImage(show.data, show.shape[1], show.shape[0],QImage.Format_RGB888)
self.label.setPixmap(QPixmap.fromImage(showImage))
self.label.setScaledContents(True) #图片自适应
self.timer_camera.start(10)
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
window = Ui_Main()
window.show()
sys.exit(app.exec_())
线程只执行一次……让我来猜一猜。
你可能会认为创建一个线程去执行某个动作就完事了?
一段代码不管是在主线程里还是在新建的线程里,它都是按代码本身的规则那么执行的,该循环就循环,该结束就结束。
所以,我们建立一个线程去执行某个动作,主要就是让这个动作的执行不影响主程的执行,不要因为它导致主程序的某环节等待这个动作的结果。
举例来说,一个定时3秒去读一下某个文件,总不能做个循环,读一下文件,然后sleep3秒吧,那除了这个,什么也干不了,基本都是在【等待3秒】这里耗着了。解决办法就是做个线程去完成【读某个文件】,然后这个事完了之后、前再建一个同样的线程让它三秒后执行。
看下图:
这个sort_loop就是这样干的:
【红框2】就是主要的工作内容(对self.data进行收缩)
如果简简单单的就这,那它就执行一次就完事了,哪怕你把sort_loop放到新线程里,也是一样。
要在sort_loop里再新建一个线程,新线程还是执行sort_loop,于是就是这样的:
A把桌子擦了擦,把抹布塞给了B;
B把桌子擦了擦,把抹布塞给了C
C把桌子擦了擦,把抹布塞给了D...
这才构成一个线程循环。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)