美文网首页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