pyqt5从入门到精通

不辜负每个朝阳,不荒废每个深夜,因平凡而奋斗,因奋斗而不平凡。

                                                                                                   ————夜色的繁星

指路明灯强烈推荐链接:https://blog.csdn.net/La_vie_est_belle/article/details/82316745 

他的视频教程地址:https://study.163.com/course/courseMain.htm?courseId=1208995818&_trace_c_p_k2_=e4ea481285d54feebc23dd3eb78e5581 


目录

 1.第一个hello程序

2.用按钮控件来展示一个按钮

3.类操作

4.布局管理

5.信号和槽

6.消息框QMessageBox



 1.第一个hello程序

import sys
from PyQt5.QtWidgets import QApplication,QLabel#QLabel是文本控件

#接着我们编写程序入口处代码
if __name__ == "__main__":
    app =  QApplication(sys.argv)#传入sys.argv参数用于构造
    label = QLabel("Hello Word")#实例化一个QLabel文本控件
    #因为窗口和控件默认是隐藏的,所以我们要调用show()来进行显示
    label.show()
    sys.exit(app.exec_())
'''此时就会进入pyqt5的主循环了,当窗口关闭的时候,app.exec_()这个方法就会返回一个0,
   作为参数给sys.exit()接着就可以正常退出python程序'''

为了让大家能够更直观的看到app对象的exec方法(app.exec())所返回的值,我这里把代码稍微修改一下,

import sys
from PyQt5.QtWidgets import QApplication,QLabel#QLabel是文本控件

#接着我们编写程序入口处代码
if __name__ == "__main__":
    app =  QApplication(sys.argv)#传入sys.argv参数用于构造
    label = QLabel("Hello Word")#实例化一个QLabel文本控件
    #因为窗口和控件默认是隐藏的,所以我们要调用show()来进行显示
    label.show()
    #修改了下面几行
    a = app.exec_()
    print(a)
    sys.exit(a)
'''此时就会进入pyqt5的主循环了,当窗口关闭的时候,app.exec_()这个方法就会返回一个0,
   作为参数给sys.exit()接着就可以正常退出python程序'''

修改完后发现返回值为零。此时a作为参数传递给了sys.exit()表示正常退出python程序

大家可能会有这个疑问为什么,app.exec_为什么会有下划线,那是因为在python2版本中exec是个关键字,为了避免冲突,

pyqt5就在自己的方法中加了下划线,因为现在使用的是python3版本了所以不加下滑先也不会有任何冲突

你可以自行查一下python的关键字:

python2查询:

输入:

help("keywords")

python3查询:

输入:

help("keywords")

通过查询我们发现python3中的exec不在是关键字

除了在构造的时候直接传入文本字符串:

label = QLabel("Hello Word")#实例化一个QLabel文本控件

我们还可以通过调用label对象的setText()的方法来设置文本

label.setText("hello word")

优点是可以在字符串当中添加Html代码来改变文本样式非常方便:

label.setText('<font color = "red">hello word</font>')

2.用按钮控件来展示一个按钮

按钮控件要用到QpushButton

需要导入QpushButton

 下面这种方法是直接在btn = QPushButton()中直接传入文本字符串来实例化

import sys
from PyQt5.QtWidgets import QApplication,QPushButton#这里导入了一个按钮控件

#接着我们编写程序入口处代码
if __name__ == "__main__":
    app =  QApplication(sys.argv)#传入sys.argv参数用于构造
    btn = QPushButton("Button")#直接传入文本字符串来实例化
    #因为窗口和控件默认是隐藏的,所以我们要调用show()来进行显示
    btn.show()
    sys.exit(app.exec())#此时a作为参数传递给了sys.exit()表示正常退出python程序
'''此时就会进入pyqt5的主循环了,当窗口关闭的时候,app.exec_()这个方法就会返回一个0,
   作为参数给sys.exit()接着就可以正常退出python程序'''

下面是调用按钮控件的利用setText()函数来设置文本

import sys
from PyQt5.QtWidgets import QApplication,QPushButton#这里导入了一个按钮控件

#接着我们编写程序入口处代码
if __name__ == "__main__":
    app =  QApplication(sys.argv)#传入sys.argv参数用于构造
    btn = QPushButton()
    btn.setText("Button")#利用setText()函数来设置文本

    #因为窗口和控件默认是隐藏的,所以我们要调用show()来进行显示
    btn.show()
    sys.exit(app.exec())#此时a作为参数传递给了sys.exit()表示正常退出python程序
'''此时就会进入pyqt5的主循环了,当窗口关闭的时候,app.exec_()这个方法就会返回一个0,
   作为参数给sys.exit()接着就可以正常退出python程序'''

3.类操作

当然一个pyqt5的项目的代码不可能全部都挤在这个程序入口中,而且之后要用到的控件肯定不止一个,如果直接实例化多个空间的话,就会出现多个窗口:

例如下面我在给大家实例化一个Qlabel:

import sys
from PyQt5.QtWidgets import QApplication,QPushButton,QLabel#这里导入了一个按钮控件

#接着我们编写程序入口处代码
if __name__ == "__main__":
    app =  QApplication(sys.argv)#传入sys.argv参数用于构造
    btn = QPushButton()
    btn.setText("Button")#利用setText()函数来设置文本
    label = QLabel()
    label.setText("Button")  # 利用setText()函数来设置文本

    #因为窗口和控件默认是隐藏的,所以我们要调用show()来进行显示
    btn.show()
    label.show()
    sys.exit(app.exec())#此时a作为参数传递给了sys.exit()表示正常退出python程序
'''此时就会进入pyqt5的主循环了,当窗口关闭的时候,app.exec_()这个方法就会返回一个0,
   作为参数给sys.exit()接着就可以正常退出python程序'''

我们需要的是把多个控件放在一个窗口当中,为了完成这样的要求同时为了让代码比较美观,更好管理我们通常会写一个类

先放一个Qlabel控件:

import sys
from PyQt5.QtWidgets import QApplication,QLabel,QWidget#这里导入了一个按钮控件


class Demo(QWidget):   #让我们自定义这个类继承QWidget,可以当做是一个空白窗口
    def __init__(self):
        super(Demo,self).__init__()#对继承自父类的属性进行初始化
        self.label = QLabel("Label",self)#第一个参数是指定的文本,第二个参数是指定的父类DemoQLabel函数
#是存在和属于于Demo()窗口上的
#接着我们编写程序入口处代码
if __name__ == "__main__":
    app =  QApplication(sys.argv)#传入sys.argv参数用于构造
    a=Demo()
    a.show()

    #因为窗口和控件默认是隐藏的,所以我们要调用show()来进行显示

    sys.exit(app.exec())#此时a作为参数传递给了sys.exit()表示正常退出python程序
'''此时就会进入pyqt5的主循环了,当窗口关闭的时候,app.exec_()这个方法就会返回一个0,
   作为参数给sys.exit()接着就可以正常退出python程

再加上一个按钮控件:

import sys
from PyQt5.QtWidgets import QApplication,QLabel,QWidget,QPushButton#这里导入了一个按钮控件


class Demo(QWidget):   #让我们自定义这个类继承QWidget,可以当做是一个空白窗口
    def __init__(self):
        super(Demo,self).__init__()
        self.label = QLabel("Label",self)#第一个参数是指定的文本,第二个参数是指定的父类DemoQLabel函数
        self.btn = QPushButton("按钮",self)
#是存在和属于于Demo()窗口上的
#接着我们编写程序入口处代码
if __name__ == "__main__":
    app =  QApplication(sys.argv)#传入sys.argv参数用于构造
    a=Demo()
    a.show()

    #因为窗口和控件默认是隐藏的,所以我们要调用show()来进行显示

    sys.exit(app.exec())#此时a作为参数传递给了sys.exit()表示正常退出python程序
'''此时就会进入pyqt5的主循环了,当窗口关闭的时候,app.exec_()这个方法就会返回一个0,
   作为参数给sys.exit()接着就可以正常退出python程序'''

运行完以后发现文本控件和按钮控件重叠了:

因为各个控件默认都是显示在窗口的左上角,所以要用布局管理器进行布局

4.布局管理

最简单的布局管理就是调用move(x,y)方法来规定各个控件在窗口上的位置,不管是窗口还是控件他们的坐标原点都在左上角,向右为x轴正方向,向下为y轴正方向。

import sys
from PyQt5.QtWidgets import QApplication,QLabel,QWidget,QPushButton#这里导入了一个按钮控件


class Demo(QWidget):   #让我们自定义这个类继承QWidget,可以当做是一个空白窗口
    def __init__(self):
        super(Demo,self).__init__()
        self.resize(600, 600)  # 设置窗口长宽都为600

        self.label = QLabel("Label",self)#第一个参数是指定的文本,第二个参数是指定的父类DemoQLabel函数
        self.btn = QPushButton("按钮",self)

        self.label.move(-20, 50)#用-20测试一下文本是否会被遮挡
        self.btn.move(50,100)
#是存在和属于于Demo()窗口上的
#接着我们编写程序入口处代码
if __name__ == "__main__":
    app =  QApplication(sys.argv)#传入sys.argv参数用于构造
    a=Demo()
    a.show()

    #因为窗口和控件默认是隐藏的,所以我们要调用show()来进行显示

    sys.exit(app.exec())#此时a作为参数传递给了sys.exit()表示正常退出python程序
"""此时就会进入pyqt5的主循环了,当窗口关闭的时候,app.exec_()这个方法就会返回一个0,
   作为参数给sys.exit()接着就可以正常退出python"""

用move可以很快的进行布局,但是当控件的数量很多的话,用这个就不在方便了,因为我们要计算很多的坐标,如果我们放大控件的话,控件不会自适应,他们还是老老实实的呆在指定坐标。为了改变这个问题,就要用到pyqt5中的布局管理器了

1.垂直布局

所谓垂直布局就是从上到下垂直进行摆放,用到了QVBoxLayout的模块

import sys
from PyQt5.QtWidgets import QApplication,QLabel,QWidget,QVBoxLayout#导入了垂直布局模块


class Demo(QWidget):   #让我们自定义这个类继承QWidget,可以当做是一个空白窗口
    def __init__(self):
        super(Demo,self).__init__()
        self.user_label = QLabel("Username:",self)
        self.pwd_label = QLabel("Password:",self)

        #实例化一个垂直布局管理器
        self.v_layout = QVBoxLayout()
        self.v_layout.addWidget(self.user_label)
        self.v_layout.addWidget(self.pwd_label)
        #最后调用上方的layout方法来将上方的垂直布局设置为窗口的整体布局
        self.setLayout(self.v_layout)
#接着我们编写程序入口处代码
if __name__ == "__main__":
    app =  QApplication(sys.argv)#传入sys.argv参数用于构造
    a=Demo()
    a.show()

    #因为窗口和控件默认是隐藏的,所以我们要调用show()来进行显示

    sys.exit(app.exec())#此时a作为参数传递给了sys.exit()表示正常退出python程序
'''此时就会进入pyqt5的主循环了,当窗口关闭的时候,app.exec_()这个方法就会返回一个0,
   作为参数给sys.exit()接着就可以正常退出python程序'''

2.水平布局

所谓水平布局就是从左到右水平依次摆放,用到了QH oxLayout的模块

import sys
from PyQt5.QtWidgets import QApplication,QLabel,QWidget,QHBoxLayout,QLineEdit#这个空间是当行文本输入框


class Demo(QWidget):   #让我们自定义这个类继承QWidget,可以当做是一个空白窗口
    def __init__(self):
        super(Demo, self).__init__()
        self.user_label = QLabel('Username:', self)
        self.user_line = QLineEdit(self)  # 1#为了更清楚的理解变量名,通常要写的很直白,这个空间是文本输入框

        self.h_layout = QHBoxLayout()  # 2
        self.h_layout.addWidget(self.user_label)  # 3#先添加的控件位置在左
        self.h_layout.addWidget(self.user_line)  # 4

        #将上面的水平布局设置为窗口的整体布局
        self.setLayout(self.h_layout)  # 5
#接着我们编写程序入口处代码
if __name__ == "__main__":
    app =  QApplication(sys.argv)#传入sys.argv参数用于构造
    a=Demo()
    a.show()

    #因为窗口和控件默认是隐藏的,所以我们要调用show()来进行显示

    sys.exit(app.exec())#此时a作为参数传递给了sys.exit()表示正常退出python程序
'''此时就会进入pyqt5的主循环了,当窗口关闭的时候,app.exec_()这个方法就会返回一个0,
   作为参数给sys.exit()接着就可以正常退出python程序'''

3.嵌套布局

添加控件用addWidget
添加布局的话用addLayout
import sys
from PyQt5.QtWidgets import QApplication,QLabel,QLineEdit,QWidget,QHBoxLayout,QVBoxLayout#导入了一个文本输入框
class Demo(QWidget):
    def __init__(self):#初始化父类属性
        super(Demo,self).__init__()#初始化父类属性

        self.yonghu_label = QLabel("用户:",self)
        self.mima_label = QLabel("密码:",self)
        self.yonghu_line = QLineEdit(self)
        self.mima_line = QLineEdit(self)

        self.h1_layout = QHBoxLayout()#水平布局
        self.h2_layout = QHBoxLayout()#水平布局
        self.v_layout = QVBoxLayout()#垂直布局
        self.h1_layout.addWidget(self.yonghu_label)
        self.h1_layout.addWidget(self.yonghu_line)
        self.h2_layout.addWidget(self.mima_label)#添加控件用addWidget
        self.h2_layout.addWidget(self.mima_line)
        self.v_layout.addLayout(self.h1_layout)#添加布局的话用addLayout
        self.v_layout.addLayout(self.h2_layout)

        self.setLayout(self.v_layout)
if __name__ == "__main__":
    app = QApplication(sys.argv)
    a=Demo()
    a.show()
    sys.exit(app.exec())

4.表单布局

表单布局通常用来设置文本型控件和输入型部件布局

import sys
from PyQt5.QtWidgets import QApplication,QLabel,QLineEdit,QWidget,QFormLayout#导入了一个文本输入框
class Demo(QWidget):
    def __init__(self):#初始化父类属性
        super(Demo,self).__init__()#初始化父类属性
        self.user_label = QLabel("Username",self)
        self.pwd_label = QLabel("Password",self)
        self.user_line = QLineEdit(self)
        self.pwd_line = QLineEdit(self)

        self.f_layout = QFormLayout() #实例化一个QFormLayout对象,设置文本控件和输入型控件的
        self.f_layout.addRow(self.user_label,self.user_line)#左边放文本控件右边放输入型控件
        self.f_layout.addRow(self.pwd_label,self.pwd_line)
        self.setLayout(self.f_layout)
if __name__ == "__main__":
    app = QApplication(sys.argv)
    a=Demo()
    a.show()
    sys.exit(app.exec())

下面是按照上面的做一下修改 

import sys
from PyQt5.QtWidgets import QApplication,QLabel,QLineEdit,QWidget,QFormLayout#导入了一个文本输入框
class Demo(QWidget):
    def __init__(self):#初始化父类属性
        super(Demo,self).__init__()#初始化父类属性
        #self.user_label = QLabel("Username",self)#可以不用实例化文本控件,直接输入文本即可
        #self.pwd_label = QLabel("Password",self)
        self.user_line = QLineEdit(self)
        self.pwd_line = QLineEdit(self)

        self.f_layout = QFormLayout() #实例化一个QFormLayout对象,设置文本控件和输入型控件的
        self.f_layout.addRow("Username",self.user_line)#左边放文本控件右边放输入型控件
        self.f_layout.addRow("paddadeword",self.pwd_line)#根据上面那个程序修改,可以不用实例化控件,直接输入名称
        self.setLayout(self.f_layout)
if __name__ == "__main__":
    app = QApplication(sys.argv)
    a=Demo()
    a.show()
    sys.exit(app.exec())

5.表格布局

import sys
from PyQt5.QtWidgets import QApplication,QLabel,QLineEdit,QWidget,QGridLayout#导入了一个文本输入框
class Demo(QWidget):
    def __init__(self):#初始化父类属性
        super(Demo,self).__init__()#初始化父类属性
        self.user_label = QLabel("Username",self)#可以不用实例化文本控件,直接输入文本即可
        self.pwd_label = QLabel("Password",self)
        self.user_line = QLineEdit(self)
        self.pwd_line = QLineEdit(self)

        self.g_layout = QGridLayout()#实例化一个网格布局
        self.g_layout.addWidget(self.user_label,0,0)#设置空间坐标位置
        self.g_layout.addWidget(self.user_line,0,1)
        self.g_layout.addWidget(self.pwd_label,1,0)
        self.g_layout.addWidget(self.pwd_line,1,1)
        self.setLayout(self.g_layout)#设置窗口最终布局

        self.setLayout(self.g_layout)
if __name__ == "__main__":
    app = QApplication(sys.argv)
    a=Demo()
    a.show()
    sys.exit(app.exec())

5.信号和槽

1.连接一个槽函数

作为pyqt5中各个对象之间的通信机制,可以说是最核心的知识点了,只有了解这个这个机制的用法才能写出功能完善的pyqt5

例如红绿灯:

rad --stop()                         信号red,green

green--go()                        槽函数:stop(),go ()

信号决定调用那个槽函数

不过信号和槽函数在连接之后才起作用

连接公式:

控件     信号      连接   槽函数

widget.signal.connect(slot)

经红绿灯代入公式:

traffic_light.red.connect(stop)

traffic_light.green.connect(go)

连接后信号发射然后启动

下面是一个按钮连接一个槽函数的代码,输出666,并将按钮控件名称修稿为Button

pyqt5中有一个按钮信号叫clicked汉语为点击的意思,这个信号在按钮被点击以后发射

 

import sys
from PyQt5.QtWidgets import QApplication,QLabel,QWidget,QVBoxLayout,QPushButton
class Demo(QWidget):
    def __init__(self):#初始化父类属性
        super(Demo,self).__init__()#初始化父类属性
        self.label = QLabel("label",self)#创建一个文本控件
        self.btn = QPushButton("Button",self)#创建一个按钮控件
        self.btn.clicked.connect(self.change_text)#按钮工具的clicked信号和槽函数进行连接

        self.v_layout = QVBoxLayout()#创建
        self.v_layout.addWidget(self.label)
        self.v_layout.addWidget(self.btn)
        self.setLayout(self.v_layout)
    def change_text(self):#建立一个槽函数
        self.label.setText("Button")
        print(666)



if __name__ == "__main__":
    app = QApplication(sys.argv)
    a=Demo()
    a.show()
    sys.exit(app.exec())

2.连接多个槽函数

除了clicked信号,Qpushbotton还有pressed是按下的哪一刻发出的,而released是释放的那一刻发出的。

import sys
from PyQt5.QtWidgets import QApplication, QWidget,QLabel,QPushButton,QVBoxLayout


class Demo(QWidget):
    def __init__(self):
        super(Demo, self).__init__()
        self.label = QLabel('Start', self)
        self.btn = QPushButton("Button",self)
        self.btn.clicked.connect(self.change_text)
        self.btn.clicked.connect(self.change_size)

        self.v_layout = QVBoxLayout()
        self.v_layout.addWidget(self.label)
        self.v_layout.addWidget(self.btn)
        self.setLayout(self.v_layout)

    def change_text(self):

        self.label.setText('Button')
        print(666)

    def change_size(self):
        self.resize(600,600)#将窗口设置成600*600



if __name__ == '__main__':
    app = QApplication(sys.argv)
    demo = Demo()
    demo.show()
    sys.exit(app.exec_())

3.带参数的槽函数

import sys
from PyQt5.QtWidgets import QApplication, QLabel, QWidget, QVBoxLayout, QPushButton


class Demo(QWidget):
    def __init__(self):  # 初始化父类属性
        super(Demo, self).__init__()  # 初始化父类属性
        self.label = QLabel("label", self)  # 创建一个文本控件
        self.btn = QPushButton("Button", self)  # 创建一个按钮控件
        self.btn.clicked.connect(lambda:self.change_text("Button"))  # 按钮工具的clicked信号和槽函数进行连接

        self.v_layout = QVBoxLayout()  # 创建
        self.v_layout.addWidget(self.label)
        self.v_layout.addWidget(self.btn)
        self.setLayout(self.v_layout)

    def change_text(self,text):  # 建立一个槽函数
        self.label.setText(text)
        print(666)


if __name__ == "__main__":
    app = QApplication(sys.argv)
    a = Demo()
    a.show()
    sys.exit(app.exec())

6.消息框QMessageBox

1.消息框一般在运行过程中提示信息,以增加程序与用户的交互能力,在一定程度上减少了用户的失误率,比方说我们在编译文本时会出现一个提示框来是否要进行保存。

一共提供了以下文本:

 虽然有那么多的消息框,但是使用方法是一样的。

接下来拿询问框做个示范。

                                父类   标题  内容    消息框的按钮

QMwssage.question(parent,title,content,button)#parent表示消息框所归属的程序窗口,通常会填写self,如果不属于任何程序窗口的话就填写None

举例子:

Qmessage.question.(None,"Question","do you wangt save it?",QMessageBox.Yes|QMessageBox.No)

除了yes和no,QMessageBox还为我们提供了以下按钮,

QMessageBox.Ok

QMessageBox.Close

QMessageBox.Cancel

QMessageBox.Open

QMessageBox.Save

注意不同的按钮只是显示不同的文本最后的功能还是我们自己来编写

程序如下:

import sys
from PyQt5.QtWidgets import QApplication, QLabel, QWidget, QVBoxLayout, QPushButton,QMessageBox


class Demo(QWidget):
    def __init__(self):  # 初始化父类属性
        super(Demo, self).__init__()  # 初始化父类属性
        self.setWindowTitle("QMessageBox Text")

        self.btn1 = QPushButton("Question", self)  # 创建一个按钮控件
        self.btn2 = QPushButton("Information",self)
        self.btn1.clicked.connect(lambda :self.show_msg_box(self.btn1))#因为槽函数带有参数,所以要用lambda
        self.btn2.clicked.connect(lambda :self.show_msg_box(self.btn2))

        self.v_layout = QVBoxLayout()  # 创建
        self.v_layout.addWidget(self.btn1)
        self.v_layout.addWidget(self.btn2)
        self.setLayout(self.v_layout)

    def show_msg_box(self,btn):  #设置一个参数通过参数来判断用户按下的是哪个按钮
        if btn == self.btn1:
            QMessageBox.question(self,"Question","Do you want to save it?",QMessageBox.Yes|QMessageBox.No)
        if btn == self.btn2:
            QMessageBox.information(self,"Information","This is a information message box",QMessageBox.Ok)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    a = Demo()
    a.show()
    sys.exit(app.exec())

2.消息框可以判断是否保存:

import sys
from PyQt5.QtWidgets import QApplication, QLabel, QWidget, QVBoxLayout, QPushButton, QMessageBox


class Demo(QWidget):
    def __init__(self):  # 初始化父类属性
        super(Demo, self).__init__()  # 初始化父类属性
        self.setWindowTitle("QMessageBox Text")#文本框标题

        self.btn1 = QPushButton("Question", self)  # 创建一个按钮控件
        self.btn2 = QPushButton("Information", self)
        self.btn1.clicked.connect(lambda: self.show_msg_box(self.btn1))  # 因为槽函数带有参数,所以要用lambda
        self.btn2.clicked.connect(lambda: self.show_msg_box(self.btn2))

        self.v_layout = QVBoxLayout()  # 创建垂直布局
        self.v_layout.addWidget(self.btn1)#将按钮控件添加到水平布局中
        self.v_layout.addWidget(self.btn2)
        self.setLayout(self.v_layout)#最后将上方的垂直布局设置为整体布局

    def show_msg_box(self, btn):  # 设置一个参数通过参数来判断用户按下的是哪个按钮
        if btn == self.btn1:
            #定义一个按钮用来保存用户所选择的按钮
            choice = QMessageBox.question(self, "Question", "Do you want to save it?", QMessageBox.Yes | QMessageBox.No)
            if choice == QMessageBox.Yes:
                print("saved")
                self.close()#关闭窗口
            elif choice == QMessageBox.No:
                self.close()

        if btn == self.btn2:
            QMessageBox.information(self, "Information", "This is a information message box", QMessageBox.Ok)


if __name__ == "__main__":
    app = QApplication(sys.argv)
    a = Demo()
    a.show()
    sys.exit(app.exec())

 

 

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值