使用python制作窗体应用【二】
- 打开Qtdesigner,该软件主要用于制作UI界面,如果使用过C#语言进行窗体应用开发的同学肯定会知道,C#的窗体界面无需代码,仅需拖拉拽即可,即所谓的所见即所得,Qtdesigner也是如此。Qt的使用,在此不再赘述。
- 使用Qt制作如下界面,此处可自行发挥,制作完毕后,保存文件,文件后缀名为.ui,代码如下,读者可复制到.txt文本文件中,然后将以下内容粘贴进去,保存然后将文件名称改为aa.ui。
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MainWindow</class>
<widget class="QMainWindow" name="MainWindow">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>709</width>
<height>560</height>
</rect>
</property>
<property name="windowTitle">
<string>MainWindow</string>
</property>
<widget class="QWidget" name="centralwidget">
<widget class="QPushButton" name="pushButton">
<property name="geometry">
<rect>
<x>80</x>
<y>440</y>
<width>151</width>
<height>51</height>
</rect>
</property>
<property name="text">
<string>确定</string>
</property>
</widget>
<widget class="QPushButton" name="pushButton_2">
<property name="geometry">
<rect>
<x>470</x>
<y>440</y>
<width>151</width>
<height>51</height>
</rect>
</property>
<property name="text">
<string>取消</string>
</property>
</widget>
<widget class="QCheckBox" name="checkBox">
<property name="geometry">
<rect>
<x>310</x>
<y>360</y>
<width>105</width>
<height>22</height>
</rect>
</property>
<property name="text">
<string>大猪蹄子</string>
</property>
</widget>
<widget class="QCheckBox" name="checkBox_2">
<property name="geometry">
<rect>
<x>310</x>
<y>110</y>
<width>191</width>
<height>51</height>
</rect>
</property>
<property name="text">
<string>渣男</string>
</property>
<property name="autoRepeatDelay">
<number>400</number>
</property>
</widget>
<widget class="QCheckBox" name="checkBox_3">
<property name="geometry">
<rect>
<x>310</x>
<y>210</y>
<width>105</width>
<height>22</height>
</rect>
</property>
<property name="text">
<string>大渣男</string>
</property>
</widget>
<widget class="QCheckBox" name="checkBox_4">
<property name="geometry">
<rect>
<x>310</x>
<y>290</y>
<width>105</width>
<height>22</height>
</rect>
</property>
<property name="text">
<string>大大渣男</string>
</property>
</widget>
<widget class="QLabel" name="label">
<property name="geometry">
<rect>
<x>240</x>
<y>50</y>
<width>321</width>
<height>18</height>
</rect>
</property>
<property name="text">
<string>请问你的男朋友是?</string>
</property>
</widget>
</widget>
<widget class="QMenuBar" name="menubar">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>709</width>
<height>30</height>
</rect>
</property>
</widget>
<widget class="QStatusBar" name="statusbar"/>
</widget>
<resources/>
<connections/>
</ui>
3. 检查python目录下的【script】目录下,是否存在“pyuic5.exe”文件,如存在,找到上一步保存的.ui文件所在的目录,按住shift,鼠标右键单击,选择【在此处打开PowerShell窗口】,打开控制台。
5. 在控制台输入“pyuic5 -o destination.py aa.ui”。‘-o’代表需生成一个文件,destination.py代表生成.py文件的名称,‘aa.ui’此处为上一步笔者生成的ui文件,如图为生成的文件。
【注意】如果存在该exe文件,但是在控制台中输入提示不存在该命令,则鼠标右键单击【我的电脑】|【属性】|【高级系统设置】|【环境变量】|【系统变量】|【Path】,将python/script(pyuic5.exe所在目录)目录添加到其中即可。
生成的destination.py源码如下:
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'aa.ui'
#
# Created by: PyQt5 UI code generator 5.9
#
# WARNING! All changes made in this file will be lost!
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(709, 560)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.pushButton = QtWidgets.QPushButton(self.centralwidget)
self.pushButton.setGeometry(QtCore.QRect(80, 440, 151, 51))
self.pushButton.setObjectName("pushButton")
self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget)
self.pushButton_2.setGeometry(QtCore.QRect(470, 440, 151, 51))
self.pushButton_2.setObjectName("pushButton_2")
self.checkBox = QtWidgets.QCheckBox(self.centralwidget)
self.checkBox.setGeometry(QtCore.QRect(310, 360, 105, 22))
self.checkBox.setObjectName("checkBox")
self.checkBox_2 = QtWidgets.QCheckBox(self.centralwidget)
self.checkBox_2.setGeometry(QtCore.QRect(310, 110, 191, 51))
self.checkBox_2.setAutoRepeatDelay(400)
self.checkBox_2.setObjectName("checkBox_2")
self.checkBox_3 = QtWidgets.QCheckBox(self.centralwidget)
self.checkBox_3.setGeometry(QtCore.QRect(310, 210, 105, 22))
self.checkBox_3.setObjectName("checkBox_3")
self.checkBox_4 = QtWidgets.QCheckBox(self.centralwidget)
self.checkBox_4.setGeometry(QtCore.QRect(310, 290, 105, 22))
self.checkBox_4.setObjectName("checkBox_4")
self.label = QtWidgets.QLabel(self.centralwidget)
self.label.setGeometry(QtCore.QRect(240, 50, 321, 18))
self.label.setObjectName("label")
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 709, 30))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.pushButton.setText(_translate("MainWindow", "确定"))
self.pushButton_2.setText(_translate("MainWindow", "取消"))
self.checkBox.setText(_translate("MainWindow", "大猪蹄子"))
self.checkBox_2.setText(_translate("MainWindow", "渣男"))
self.checkBox_3.setText(_translate("MainWindow", "大渣男"))
self.checkBox_4.setText(_translate("MainWindow", "大大渣男"))
self.label.setText(_translate("MainWindow", "请问你的男朋友是?"))
- 在pycham中打开该.py文件,运行后发现并无窗体出现。只需要在末尾添加一个主程序入口,代码如下【一般将主程序入口与函数分离,不放在同一文件中,此处为示例】,运行后出现窗体,该窗体即为在qt中设计的窗体。
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())
【完整代码如下】***
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'aa.ui'
#
# Created by: PyQt5 UI code generator 5.9
#
# WARNING! All changes made in this file will be lost!
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(709, 560)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.pushButton = QtWidgets.QPushButton(self.centralwidget)
self.pushButton.setGeometry(QtCore.QRect(80, 440, 151, 51))
self.pushButton.setObjectName("pushButton")
self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget)
self.pushButton_2.setGeometry(QtCore.QRect(470, 440, 151, 51))
self.pushButton_2.setObjectName("pushButton_2")
self.checkBox = QtWidgets.QCheckBox(self.centralwidget)
self.checkBox.setGeometry(QtCore.QRect(310, 360, 105, 22))
self.checkBox.setObjectName("checkBox")
self.checkBox_2 = QtWidgets.QCheckBox(self.centralwidget)
self.checkBox_2.setGeometry(QtCore.QRect(310, 110, 191, 51))
self.checkBox_2.setAutoRepeatDelay(400)
self.checkBox_2.setObjectName("checkBox_2")
self.checkBox_3 = QtWidgets.QCheckBox(self.centralwidget)
self.checkBox_3.setGeometry(QtCore.QRect(310, 210, 105, 22))
self.checkBox_3.setObjectName("checkBox_3")
self.checkBox_4 = QtWidgets.QCheckBox(self.centralwidget)
self.checkBox_4.setGeometry(QtCore.QRect(310, 290, 105, 22))
self.checkBox_4.setObjectName("checkBox_4")
self.label = QtWidgets.QLabel(self.centralwidget)
self.label.setGeometry(QtCore.QRect(240, 50, 321, 18))
self.label.setObjectName("label")
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 709, 30))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.pushButton.setText(_translate("MainWindow", "确定"))
self.pushButton_2.setText(_translate("MainWindow", "取消"))
self.checkBox.setText(_translate("MainWindow", "大猪蹄子"))
self.checkBox_2.setText(_translate("MainWindow", "渣男"))
self.checkBox_3.setText(_translate("MainWindow", "大渣男"))
self.checkBox_4.setText(_translate("MainWindow", "大大渣男"))
self.label.setText(_translate("MainWindow", "请问你的男朋友是?"))
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())
【末尾总结】
PyQt可使用一行代码便可将Qt生成的Ui文件转换为Python代码,弥补了python制作窗体应用的短板,但相较于C#而言,该方面还是有较大缺点。