使用PyQt5设计UI界面开发桌面应用程序的小伙伴,刚开始可能都会遇到这样让人不爽的事:用Qt Designer好不容易设计好的界面并写好逻辑代码,已经可以正常运行了,某天发现界面要做个小改动(这种事好象永远都避不了),重新修改好UI界面窗口,用PyUIC将界面窗口再次生成Python代码,这时你会悲伤的发现:以前千辛万苦写好的逻辑代码全部没有了,需要在新生成的界面代码内重新加入逻辑代码!这实在是一件让人奔溃的事。
只有将界面与逻辑代码分离,才能终结这种不辛的事再次发生!
本示例使用的发卡设备:https://item.taobao.com/item.htm?id=615391857885&spm=a1z10.5-c.w4002-21818769070.11.6cc85700Robi3x
一、使用Qt Designer新建窗体文件MifareCardRW.ui,将需要的控件拖入窗体并布局好,

二、Python项目内,右击已布局好的窗体文件MifareCardRW.ui,选击菜单External Tool\PyUIC,将窗体文件自动生成Python代码文件MifareCardRW.py。

三、新建逻辑代码文件call_MifareCardRW.py,加入代码from mainwindow import Ui_MainWindow引入窗体类,并且为需要的控件绑定槽函数:

四、运行逻辑代码call_MifareCardRW.py,你会发现以前设计好的窗体打开,且各控件事件运行正常,以后再改动窗体文件MifareCardRW.ui,只要不更改以前控件名称,重新生成MifareCardRW.py窗体代码,逻辑代码不用更改还正常运行,这样逻辑与界面代码就分开啦。

五、逻辑代码 call_MifareCardRW.py 源码
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QApplication, QWidget, QDesktopWidget,QMessageBox
from MifareCardRW import Ui_Frame
import sys
import struct # struct的pack函数把任意数据类型变成字符串
import ctypes # 调用DLL动态库要有这个引用
# 控制字定义
BLOCK0_EN = eval('0x01') # 读写块0
BLOCK1_EN = eval('0x02') # 读写块1
BLOCK2_EN = eval('0x04') # 读写块2
NEEDSERIAL = eval('0x08') # 读写指定序列号的卡
EXTERNKEY = eval('0x10') # 需要每次指定密码
NEEDHALT = eval('0x20') # 写卡后是否休眠卡
readblockdata=bytes(16) #保存读取的块数据,用做写UID后面的厂家信息
class MainWindow(QtWidgets.QMainWindow, Ui_Frame):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
self.setupUi(self)
self.pushButton_beep.clicked.connect(self.pushButton_beep_Clicked)
self.pushButton_clearlist.clicked.connect(self.pushButton_clearlist_click)
self.pushButton_getdevicenum.clicked.connect(self.pushButton_getdevicenum_click)
self.pushButton_piccreadex.clicked.connect(self.pushButton_piccreadex_click)
self.pushButton_piccwriteex.clicked.connect(self.pushButton_piccwriteex_click)
self.pushButton_piccchangesinglekey.clicked.connect(self.pushButton_piccchangesinglekey_click)
self.pushButton_piccread.clicked.connect(self.pushButton_piccread_click)
self.pushButton_piccwrite.clicked.connect(self.pushButton_piccwrite_click)
self.pushButton_piccwriteserial.clicked.connect(self.pushButton_piccwriteserial_click)
self.textEdit_thisblock.textChanged.connect(self.textEdit_thisblock_change_handler)
self.textEdit_block0.textChanged.connect(self.textEdit_block0_change_handler)
self.textEdit_block1.textChanged.connect(self.textEdit_block1_change_handler)
self.textEdit_block2.textChanged.connect(self.textEdit_block2_change_handler)
self.textEdit_newkey.textChanged.connect(self.textEdit_newkey_change_handler)
def LoadLibrary(self):
import sys
if sys.platform == 'win32':
# windows系统加载当前目录下的DLL库
dllfile = sys.path[0] + '\OUR_MIFARE.dll'
Objdll = ctypes.windll.LoadLibrary(dllfile)
elif sys.platform == 'linux':
# Linux加载当前目录下的so库
dllfile = sys.path[0] + '/libOURMIFARE.so'
Objdll = ctypes.cdll.LoadLibrary(dllfile)
else:
# macOS加载当前目录下的.dylib库
dllfile = sys.path[0] + '/libOURMIFARE.dylib'
Objdll = ctypes.cdll.LoadLibrary(dllfile)
return Objdll
def textEdit_thisblock_chan

使用PyQt5开发桌面应用时,修改UI界面会导致之前的逻辑代码丢失。本文介绍了将界面与逻辑代码分离的方法,包括使用Qt Designer新建窗体文件、用PyUIC生成Python代码、新建逻辑代码文件并绑定槽函数等,实现界面改动时逻辑代码不受影响。
最低0.47元/天 解锁文章
1968

被折叠的 条评论
为什么被折叠?



