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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,372评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,368评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,415评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,157评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,171评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,125评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,028评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,887评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,310评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,533评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,690评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,411评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,004评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,812评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,693评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,577评论 2 353

推荐阅读更多精彩内容