文章目录
本章将以一个很简单的程序示例,展示一下designer.exe生成程序的方便快捷。
1.designer生成界面
Pycharm打开designer.exe显示的界面如下图所示,可以选择的方式有五种,但一般会选择Main Window或者Widget,我个人习惯使用Main Window,是因为Main Window生成界面的同时可以选择是否包含菜单栏、状态栏等,但风险与收益并存,功能越多也意味着其所需要的内存也会更多。
Pycharm选择Main Window,点击创建:
创建完成,将会显示一个新的软件界面,如下图所示:
(1)菜单栏与状态栏
如之前所示,Main Window可创建菜单栏、状态栏,从刚创建的界面就可以看出来,这里暂时只简单介绍下菜单栏、状态栏的位置。
(a)菜单栏
菜单栏是在软件界面的最上方,一般用于设置文件、编辑、设置等功能,与designer.exe上方显示的功能界面一致。
(b)状态栏
状态栏与菜单栏作为孪生兄弟,位置相反,状态栏是在软件界面的最下方,一般用于显示刚打开的文件位置在哪、时间、运行状态等。
介绍完了菜单栏、状态栏,那么就有新问题了,虽然选择了Main Window,但是不想要菜单栏、状态栏,那么可不可以去掉呢?bingo!当然是可以的,只需要在菜单栏、状态栏位置分别右键移除就可以了。
1).移除菜单栏
2).移除菜单栏效果
3).移除状态栏
4).移除状态栏效果
(2)编辑界面
简单案例主打的就是简单,这一节用一个Label标签控件和一个PushButton按钮控件实现点击按钮之后标签的数字自增1,那让我们真正开始与designer.exe愉快的玩耍吧!
按住左侧Push Button按钮控件向软件界面拖拽就可以生成一个PushButton,如下图所示:
同样的,按住左侧Label标签控件向软件界面拖拽就可以生成一个Label,如下图所示:
好的,到这里,小程序的控件界面就完成啦,给自己比个赞吧,记得保存哦,我们这里保存命名为win.ui文件:
2.从ui文件转成py文件
右键刚才创建的ui文件所在的文件夹,选择用Pycharm打开,我们需要生成ui文件对应的py文件,右键选择External Tools中的Pyuic5工具,将会在文件夹下生成win.py:
这里没有External Tools中的Pyuic5工具的,直接在win.ui所在文件夹路径输入cmd然后输入pyuic5 -o win.py win.ui
External Tools中的Pyuic5工具设置方法在我的另一篇博客:Pycharm里设置关于designer.exe以及pyuic5.exe的外部工具
3.编写main文件运行程序
前面的步骤完成了界面的绘制,界面文件转换成可以执行的python文件,但是界面文件不是程序的运行主文件,还需要再写一个主文件对界面文件进行调用才可以显示,正如大家虽然都是小帅哥、小美女,但是也还需要穿衣服才能出门一样。那就让我们看看可以穿出门的衣服如何编织!
选中文件夹,右键新建python文件,命名为main文件(命名为其他的名字也是可以正常运行的,但是为了规范化,建议命名为main):
创建完成后,复制一下代码到你的main文件中:
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow
from win import Ui_MainWindow
class Window(QMainWindow, Ui_MainWindow):
def __init__(self):
super(Window, self).__init__()
self.setupUi(self)
if __name__ == '__main__':
app = QApplication(sys.argv)
mywin = Window()
mywin.show()
sys.exit(app.exec_())
需要注意下第三行代码:from win import Ui_MainWindow
这里的win是你的ui文件转换成py文件的名字,后面的Ui_MainWindow是你的ui文件转换成py文件后里面的一个类,让我们看下这个类吧,打开win.py一览究竟:
可以发现,文件里写明了我们刚创建的按钮和标签控件。
步骤既然都完成了,那就运行main.py看一下吧,光看不练假把式,运行结果如下:
可以发现界面正常显示了,并且有我们创建的两个控件。
好奇宝宝又出现了,我刚才创建的界面可是比这个显示的界面大了很多,为啥显示的这个界面这么小呢???这个问题呀,在于电脑屏幕的分辨率大家一般设置的都不是100%,而是150%,所以就会比我们运行现实的界面大了很多,那难道这个问题需要需要修改分辨率才可以解决吗?当然也不是,哪怕修改了自己的分辨率,日后分享给其他人使用,难道还要再改?所以为了避免这种无意义式的劳动,PyQt5提供了一条针对分辨率问题导致运行界面不相符的问题,代码如下:
QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling)
那么完整的main文件代码如下:
import sys
from PyQt5 import QtCore
from PyQt5.QtWidgets import QApplication, QMainWindow
from win import Ui_MainWindow
class Window(QMainWindow, Ui_MainWindow):
def __init__(self):
super(Window, self).__init__()
self.setupUi(self)
if __name__ == '__main__':
QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling)
app = QApplication(sys.argv)
mywin = Window()
mywin.show()
sys.exit(app.exec_())
再次运行看下效果吧!
Perfect!程序运行成功了,也是给提供了情绪价值了有木有!
好啦,界面都可以正常显示了,那么该干正事了,设置点击按钮正常标签数字自增1。
让我们来梳理一下程序完成的设计思路,首先label的显示需要是数字,然后按钮触发的应该是函数,函数的功能则是让数字自增1并且自增完还要让label显示。
这里需要注意的是:
①label显示的是字符串str,所以在显示数字之前需要将int格式转换成str格式
②PyQt5的变量、函数可以通过添加self进行调用,通俗易懂点解释,就是类似全局变量,只要加上了self,在class里都可以调用。
import sys
from PyQt5 import QtCore
from PyQt5.QtWidgets import QApplication, QMainWindow
from win import Ui_MainWindow
class Window(QMainWindow, Ui_MainWindow):
def __init__(self):
super(Window, self).__init__()
self.setupUi(self)
self.label_num = 0
self.label.setText(str(self.label_num))
self.pushButton.clicked.connect(self.num_add)
def num_add(self):
self.label_num = self.label_num +1
self.label.setText(str(self.label_num))
if __name__ == '__main__':
QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling)
app = QApplication(sys.argv)
mywin = Window()
mywin.show()
sys.exit(app.exec_())
运行界面看看效果吧,可以看到点击按钮后,标签的数字会自增1,运行成功。