美文网首页pyqt学习笔记程序员Python开发
PyQt+PIL做P图软件(2)--PyQt5使用

PyQt+PIL做P图软件(2)--PyQt5使用

作者: Stack_empty | 来源:发表于2017-03-13 01:45 被阅读736次

本节呢,介绍一下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)/~
而且我跟你说,好戏还在后面呢![奸笑~]

相关文章

网友评论

  • Symbian米汤:楼主还有puqt相关的更新没?
    Stack_empty:@Symbian米汤 近期还在准备考研……考完研就继续更新😶不好意思…
  • 73c3aad44c78::+1: 意外的看的很认真

本文标题:PyQt+PIL做P图软件(2)--PyQt5使用

本文链接:https://www.haomeiwen.com/subject/dltfnttx.html