本节呢,介绍一下python的PyQt5包的一些基础。PyQt是Python版本的Qt,Qt是一款功能强大的图形界面工具。我们上一节了解了PIL图形基本处理,现在要开始搭建咱们的软件界面了![鸡冻~~]
这里先说一下哈,以我个人来看,写python的图形界面,最好还是有一个可视化工具,比如Qt Creator,专门写Qt界面的。但是用它之前我们要先学基本的代码,要能看懂,这样才能修改我们用Qt Creator做出来的界面,添加功能进去。所以了,就算我们自己写的代码没有那么的规范,没有那么地规范化,也没有关系,关键是要懂其中的原理。
—>用PyQt写界面呢,基本分为5个部分:
- 引入所需的包
- 构造一个基类窗口
- 初始化窗口上的部件
- 写部件触发的事件的函数(称为“槽”)
- 创建上面这个类的实例对象
下面依次用代码说明:
1.引入所需的包
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import QCoreApplication
import sys
我用的是PyQt5,如果你用的是PyQt4就自己换一下。
不要问我这每一行对应的包/工具是什么,没必要问,一股脑都放进来就行了!多一行又不会少一块肉,更不会让程序变慢,也不会占你内存啊。
2.构造一个基类窗口
class MyWidget(QMainWindow):
def __init__(self):
super().__init__()
self.setGeometry(300,300,500,500)
# ↑设置窗口初始位置和长宽
self.setWindowTitle("My Qt Window")
# ↑设置窗口标题
self.setToolTip("<font color=red>This is a window by CodingY.</font>")
# ↑这一句可以忽略,ToolTip就是当你鼠标
# 放在上面的时候,会显示一个信息。
# 这里牛逼之处在于,文本可以用CSS修饰!
self.setWindowIcon(QIcon("yxx2.ico"))
# ↑这个是设置一个图标,可有可无。
就是这样的窗口
3.添加窗口组件
下面都是纸老虎!!大伙儿不要害怕!70%的代码都不用管!!*
# 做一个输入区域:
text=QTextEdit()
self.setCentralWidget(text)
text.resize(300,300)
# 搞一个加号按钮、一个减号按钮试试:
btn1=QPushButton(" + ",self)
# btn1.setGeometry(100,100,100,50) #设置相对位置和大小
btn1.resize(btn1.sizeHint())
btn1.move(350,100) #设置移动的距离
btn1.setToolTip("<b>This is <font color=red><big>Addition</big></font></b>")
btn2=QPushButton(" - ",self)
btn2.resize(btn2.sizeHint())
btn2.move(350,160)
btn2.setToolTip("<b>This is <font color=red><big>Minus</big></font></b>")
# setToolTip这个玩意儿,会让你的鼠标在窗口的时候,显示这行字。
# 做一个“退出”按钮~~这里就需要用到“信息-槽”了:
btn_quit=QPushButton(" 不玩了-_- ",self)
btn_quit.move(330,450)
btn_quit.setStyleSheet('''
color:white;
background-color:black;
selection-color:white;
selection-background-color:black;
font: bold 25px;
border-radius:10px;
border-width:100px;
border-color:red;
padding:5px;
''') # ### 这才是真的牛逼的地方! 可以用样式!
btn_quit.resize(btn_quit.sizeHint())
btn_quit.setToolTip("<b>Quit the game···</b>")
btn_quit.clicked.connect(self.write_on_IDE) #这里就是著名的信息-槽
# 做菜单栏:
action1_file=QAction(QIcon("yxx2.ico"),"Open",self) # 妈的,这个self必须带着···
action2_file=QAction(QIcon("yxx2.ico"),"Save",self)
action3_file=QAction(QIcon("yxx2.ico"),"See you",self)
action3_file.setShortcut("Esc") # 牛逼!居然可以设置快捷键!
action3_file.triggered.connect(qApp.quit) # 这里用QCoreApplica.quit一样,不知道什么区别
menubar=self.menuBar() # 不知道为何是self.menuBar,不知道和QMenubar的区别和用法···MD真操心···
menu_file=menubar.addMenu("File")
menu_file.addAction(action1_file)
menu_file.addAction(action2_file)
menu_file.addAction(action3_file)
# 做一个工具栏:
action1_tool=QAction("Pen",self)
action2_tool=QAction("Ball",self)
action3_tool=QAction("Hhhhh",self)
toolbar=self.addToolBar("Tools")
toolbar.addAction(action1_tool)
toolbar.addAction(action2_tool)
toolbar.addAction(action3_tool)
效果图是这样的:
一个极丑的界面讲真,上面的这些代码不用仔细看(里面还有一些自己学PyQt时爆的粗口···大家请无视%_%),大家大致看一看,可以发现都是套路:
拿创造一个按钮为例吧
先定义一个按钮组件:
btn=QPushButton("按钮的名字",self)
然后改一改大小,调一调位置:
btn.resize(100,50)
btn.move(100,100)
这不就好了吗?
4.为组件设置函数(即信息-槽)
def write_on_IDE(self):
print("不玩就滚!")
def closeEvent(self,event): # 这个closeEvent是父类的方法,这里把它重写了一下!
reply=QMessageBox.question(self,"Waring","<b><font color=red>你真的要这么做吗?</font></b>",QMessageBox.Yes | QMessageBox.No,QMessageBox.No)
if reply==QMessageBox.Yes:
event.accept()
if reply==QMessageBox.No:
event.ignore()
我们看着第一个函数def write_on_IDE()
,这个是我们定义的一个动作。我想把它接到我们的那个“不玩了”按钮上面,怎么办?
大家回头看看第3步的代码,可以看到在“不玩了”按钮下面有一行这个:
btn_quit.clicked.connect(self.write_on_IDE)
(注意这里函数后面千万不能加括号!!!)
这个就把咱们的按钮和函数连一起了!
这样我们一点击“不玩了”按钮,就会触发这个函数,在屏幕上显示我们设置的文字:
5.创建实例对象,显示窗口:
其实上面的代码,都还不能显示窗口,必须在最后加上这一段:
myapp=QApplication(sys.argv)
myFirstWidget=MyWidget()
# ↑创建上面类的实例
myFirstWidget.show()
# ↑秀出来吧!
sys.exit(myapp.exec_())
第一行和第四行没必要理解,反正必须有,可以直接复制使用。
好了,就这么简单,最后附上全部代码:
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import QCoreApplication
import sys
class MyWidget(QMainWindow): # QWidget换成了QMainWindow 什么区别呀??
def __init__(self):
super().__init__()
self.setGeometry(300,300,500,500)
self.setWindowTitle("My Qt Window")
self.setToolTip("<font color=red>This is a window by GBY.</font>")
self.setWindowIcon(QIcon("yxx2.ico"))
# 做一个输入区域:
text=QTextEdit()
self.setCentralWidget(text)
text.resize(300,300)
# 搞一个加号按钮、一个减号按钮试试:
btn1=QPushButton(" + ",self)
# btn1.setGeometry(100,100,100,50) #设置相对位置和大小
btn1.resize(btn1.sizeHint())
btn1.move(350,100) #设置移动的距离
btn1.setToolTip("<b>This is <font color=red><big>Addition</big></font></b>")
btn2=QPushButton(" - ",self)
btn2.resize(btn2.sizeHint())
btn2.move(350,160)
btn2.setToolTip("<b>This is <font color=red><big>Minus</big></font></b>")
# setToolTip这个玩意儿,会让你的鼠标在窗口的时候,显示这行字。
# 做一个“退出”按钮~~这里就需要用到“信息-槽”了:
btn_quit=QPushButton(" 不玩了-_- ",self)
btn_quit.move(330,450)
btn_quit.setStyleSheet('''
color:white;
background-color:black;
selection-color:white;
selection-background-color:black;
font: bold 25px;
border-radius:10px;
border-width:100px;
border-color:red;
padding:5px;
''') # ### 这才是真的牛逼的地方! 可以用样式!
btn_quit.resize(btn_quit.sizeHint())
btn_quit.setToolTip("<b>Quit the game···</b>")
btn_quit.clicked.connect(self.write_on_IDE) #这里换成self.write_on_IDE一样可以出结果!
# 做菜单栏:
# self.statusBar() # 干啥玩意儿的啊
action1_file=QAction(QIcon("yxx2.ico"),"Open",self) # 妈的,这个self必须带着···
action2_file=QAction(QIcon("yxx2.ico"),"Save",self)
action3_file=QAction(QIcon("yxx2.ico"),"See you",self)
action3_file.setShortcut("Esc") # 牛逼!居然可以设置快捷键!
action3_file.triggered.connect(qApp.quit) # 这里用QCoreApplica.quit一样,不知道什么区别
menubar=self.menuBar() # 不知道为何是self.menuBar,不知道和QMenubar的区别和用法···MD真操心···
menu_file=menubar.addMenu("File")
menu_file.addAction(action1_file)
menu_file.addAction(action2_file)
menu_file.addAction(action3_file)
# 做一个工具栏:
action1_tool=QAction("Pen",self)
action2_tool=QAction("Ball",self)
action3_tool=QAction("Hhhhh",self)
toolbar=self.addToolBar("Tools")
toolbar.addAction(action1_tool)
toolbar.addAction(action2_tool)
toolbar.addAction(action3_tool)
def write_on_IDE(self):
print("不玩就滚!")
def closeEvent(self,event): # 这个closeEvent是父类的方法,这里把它重写了一下!
reply=QMessageBox.question(self,"Waring","<b><font color=red>你真的要这么做吗?</font></b>",QMessageBox.Yes | QMessageBox.No,QMessageBox.No)
if reply==QMessageBox.Yes:
event.accept()
if reply==QMessageBox.No:
event.ignore()
myapp=QApplication(sys.argv)
myFirstWidget=MyWidget()
myFirstWidget.show()
sys.exit(myapp.exec_())
不要纠结这些代码的细节,因为有很多不完善的地方,我只是为了让大家知道5个部分大致的位置。
欢迎关注我的系列哦~
让我们一步步地从0到1做出一款实用软件出来!(o)/~
而且我跟你说,好戏还在后面呢![奸笑~]
网友评论