python PyQt5学习笔记 Hello World 菜单和工具栏 布局管理 有注释 p1

Hello World

例1,简单的窗口

import sys
from PyQt5.QtWidgets import QApplication, QWidget
# 这里引入了PyQt5.QtWidgets模块,这个模块包含了基本的组件。

if __name__ == '__main__':

    app = QApplication(sys.argv)#每个PyQt5应用都必须创建一个应用对象。sys.argv是一组命令行参数的列表
    w = QWidget()#窗口
    w.resize(550, 450)#resize()方法能改变控件的大小,这里的意思是窗口宽250px,高150px
    w.move(300, 300)#移动
    w.setWindowTitle('Simple')#设置标题
    w.show()

    sys.exit(app.exec_())

例2,带窗口图标

class Example(QWidget):

    def __init__(self):
        super().__init__()
        ...


面向对象编程最重要的三个部分是类(class)、数据和方法。我们创建了一个类的调用,这个类继承自QWidget。这就意味着,我们调用了两个构造器,一个是这个类本身的,一个是这个类继承的。super()构造器方法返回父级的对象。__init__()方法是构造器的一个方法。

setGeometry(坐标的x,y,窗口大小的宽,高)把窗口放到屏幕上并且设置窗口大小(resize()move()的合体)

# import sys
# from PyQt5.QtWidgets import QApplication, QWidget
# from PyQt5.QtGui import QIcon
#
# class Example(QWidget):
#     def __init__(self):
#         super().__init__()
#         self.initUI()
#     def initUI(self):
#         self.setGeometry(300, 300, 300, 220)
#         self.setWindowTitle('Icon')
#         self.setWindowIcon(QIcon('web.png'))
#         self.show()
# if __name__ == '__main__':
#     app = QApplication(sys.argv)
#     ex = Example()
#     sys.exit(app.exec_())

例3,提示框(按钮)

import sys
from PyQt5.QtWidgets import (QWidget, QToolTip,
    QPushButton, QApplication)
from PyQt5.QtGui import QFont


class Example(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()
    def initUI(self):
        # QToolTip.setFont(QFont('SansSerif', 10))

        self.setToolTip('这是<b>背景</b>提示')

        btn = QPushButton('Button', self)
        btn.setToolTip('这里是<b>按钮</b>提示')
        btn.resize(btn.sizeHint())
        btn.move(50, 50)
        but2=QPushButton('第二个按钮',self)
        but2.setToolTip('按钮二提示')
        but2.resize(but2.sizeHint())
        but2.move(200,50)
        self.setGeometry(300, 300, 300, 200)
        self.setWindowTitle('Tooltips')
        self.show()


if __name__ == '__main__':

    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

QToolTip.setFont(QFont('SansSerif', 10))
这个静态方法设置了提示框的字体,我们使用了10px的SansSerif字体。


self.setToolTip('This is a <b>QWidget</b> widget')
调用setTooltip()创建提示框可以使用富文本格式的内容。


btn = QPushButton('Button', self)
btn.setToolTip('This is a <b>QPushButton</b> widget')
创建一个按钮,并且为按钮添加了一个提示框。


btn.resize(btn.sizeHint())
btn.move(50, 50)
调整按钮大小,并让按钮在屏幕上显示出来,sizeHint()方法提供了一个默认的按钮大小。

例4,关闭窗口

关闭一个窗口最直观的方式就是点击标题栏的那个叉,这个例子里,我们展示的是如何用程序关闭一个窗口。这里我们将接触到一点single和slots(插槽)的知识。

本例使用的是QPushButton组件类。

QPushButton(string text, QWidget parent = None)

Copied!

text参数是想要显示的按钮名称,parent参数是放在按钮上的组件,在我们的 例子里,这个参数是QWidget。应用中的组件都是一层一层(继承而来的?)的,在这个层里,大部分的组件都有自己的父级,没有父级的组件,是顶级的窗口。

import sys
from PyQt5.QtWidgets import QWidget, QPushButton, QApplication
from PyQt5.QtCore import QCoreApplication

class Example(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()
    def initUI(self):
        qbtn = QPushButton('Quit', self)
        qbtn.clicked.connect(QCoreApplication.instance().quit)
        qbtn.resize(qbtn.sizeHint())
        qbtn.move(50, 50)
        self.setGeometry(300, 300, 250, 150)
        self.setWindowTitle('Quit button')
        self.show()
if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

例5,消息盒子

如果关闭QWidget,就会产生一个QCloseEvent,并且把它传入到closeEvent函数的event参数中。改变控件的默认行为,就是替换掉默认的事件处理。

reply = QMessageBox.question(self, 'Message',
    "Are you sure to quit?", QMessageBox.Yes | 
    QMessageBox.No, QMessageBox.No)
我们创建了一个消息框,上面有俩按钮:Yes和No.第一个字符串显示在消息框的标题栏第二个字符串显示在对话框第三个参数是消息框的俩按钮最后一个参数是默认按钮,这个按钮是默认选中的。返回值在变量reply里。
if reply == QMessageBox.Yes:
    event.accept()
else:
    event.ignore()
这里判断返回值,如果点击的是Yes按钮,我们就关闭组件和应用,否者就忽略关闭事件。

import sys
from PyQt5.QtWidgets import QWidget, QMessageBox, QApplication

class Example(QWidget):

    def __init__(self):
        super().__init__()
        self.initUI()
    def initUI(self):
        self.setGeometry(300, 300, 250, 150)
        self.setWindowTitle('Message box')
        self.show()
    def closeEvent(self, event):#默认函数
        reply = QMessageBox.question(self, 'Message',
            "Are you sure to quit?", QMessageBox.Yes |
            QMessageBox.No, QMessageBox.No)
        if reply == QMessageBox.Yes:
            event.accept()
        else:
            event.ignore()
if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

例6,窗口居中

QtGui.QDesktopWidget提供了用户的桌面信息,包括屏幕的大小。
self.center()
这个方法是调用我们下面写的,实现对话框居中的方法。
qr = self.frameGeometry()
获得主窗口所在的框架。
cp = QDesktopWidget().availableGeometry().center()
获取显示器的分辨率,然后得到屏幕中间点的位置。
qr.moveCenter(cp)
然后把主窗口框架的中心点放置到屏幕的中心位置。
self.move(qr.topLeft())
然后通过move函数把主窗口的左上角移动到其框架的左上角,这样就把窗口居中了。

import sys
from PyQt5.QtWidgets import QWidget, QDesktopWidget, QApplication

class Example(QWidget):

    def __init__(self):
        super().__init__()
        self.initUI()
    def initUI(self):
        self.resize(250, 150)
        self.center()
        self.setWindowTitle('Center')
        self.show()
    def center(self):
        qr = self.frameGeometry()
        cp = QDesktopWidget().availableGeometry().center()
        qr.moveCenter(cp)
        self.move(qr.topLeft())

if __name__ == '__main__':

    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

菜单和工具栏

这个章节,我们会创建状态栏、菜单和工具栏。菜单是一组位于菜单栏的命令。工具栏是应用的一些常用工具按钮。状态栏显示一些状态信息,通常在应用的底部。

主窗口

QMainWindow提供了主窗口的功能,使用它能创建一些简单的状态栏、工具栏和菜单栏。

状态栏

statusBar()方法,创建状态栏。第一次调用会创建一个状态栏,而再次调用会返回一个状态栏对象。showMessage()方法在状态栏上显示一条信息。

self.statusBar().showMessage('Ready')

菜单栏

在示例中,我们创建了只有一个命令的菜单栏,这个命令就是终止应用。同时也创建了一个状态栏。而且还能使用快捷键Ctrl+Q退出应用。


exitAct = QAction(QIcon('exit.png'), '&Exit', self)        
exitAct.setShortcut('Ctrl+Q')
exitAct.setStatusTip('Exit application')
QAction是菜单栏、工具栏或者快捷键的动作的组合。上面三行中,前两行创建了一个图标、一个exit的标签和一个快捷键组合,都执行了一个动作;第三行,创建了一个状态栏,当鼠标悬停在菜单栏的时候,能显示当前状态。


exitAct.triggered.connect(qApp.quit)
当执行这个指定的动作时,就触发了一个事件。这个事件跟QApplication的quit()行为相关联,所以这个动作就能终止这个应用。


menubar = self.menuBar()
fileMenu = menubar.addMenu('&File')
fileMenu.addAction(exitAct)
menuBar()创建菜单栏。这里创建了一个菜单栏,并用addMenu()在上面添加了一个file菜单,用addAction()关联了点击退出应用的事件。

import sys
from PyQt5.QtWidgets import QMainWindow, QAction, qApp, QApplication
from PyQt5.QtGui import QIcon


class Example(QMainWindow):
    def __init__(self):
        super().__init__()
        self.initUI()
    def initUI(self):

        exitAct = QAction(QIcon('exit.png'), '&Exit', self)
        exitAct.setShortcut('Ctrl+Q')
        exitAct.setStatusTip('Exit application')
        exitAct.triggered.connect(qApp.quit)
        self.statusBar()
        menubar = self.menuBar()
        fileMenu = menubar.addMenu('&File')
        fileMenu.addAction(exitAct)
        gongnen=QAction('清空',self)
        fileMenu.addAction(gongnen)
        self.setGeometry(300, 300, 300, 200)
        self.setWindowTitle('Simple menu')
        self.show()
if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

子菜单

子菜单是嵌套在菜单里面的二级或者三级等的菜单。

import sys
from PyQt5.QtWidgets import QMainWindow, QAction, QMenu, QApplication

class Example(QMainWindow):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        menubar = self.menuBar()
        fileMenu = menubar.addMenu('File')

        impMenu = QMenu('Import', self)
        impAct = QAction('Import mail', self)
        impMenu.addAction(impAct)
        impmail2=QAction('2',self)
        impMenu.addAction(impmail2)

        newAct = QAction('New', self)
        fileMenu.addAction(newAct)
        fileMenu.addMenu(impMenu)

        fileMenu = menubar.addMenu('反馈')

        self.setGeometry(300, 300, 300, 200)
        self.setWindowTitle('Submenu')
        self.show()


if __name__ == '__main__':

    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

这个例子里,有两个子菜单,一个在File菜单下面,一个在File的Import下面。
impMenu = QMenu('Import', self)
使用QMenu创建一个新菜单。
impAct = QAction('Import mail', self) 
impMenu.addAction(impAct)
使用addAction()添加一个动作。


1

 勾选菜单

import sys
from PyQt5.QtWidgets import QMainWindow, QAction, QApplication

class Example(QMainWindow):

    def __init__(self):
        super().__init__()

        self.initUI()


    def initUI(self):

        self.statusbar = self.statusBar()
        self.statusbar.showMessage('Ready')

        menubar = self.menuBar()
        viewMenu = menubar.addMenu('View')

        viewStatAct = QAction('View statusbar', self, checkable=True)
        viewStatAct.setStatusTip('View statusbar')
        viewStatAct.setChecked(True)
        viewStatAct.triggered.connect(self.toggleMenu)

        viewMenu.addAction(viewStatAct)

        self.setGeometry(300, 300, 300, 200)
        self.setWindowTitle('Check menu')
        self.show()

    def toggleMenu(self, state):

        if state:
            print('YES')
            self.setWindowTitle('Check menu YES')
            self.statusbar.show()
        else:
            print('NO')
            self.setWindowTitle('Check menu NO')
            self.statusbar.hide()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

本例创建了一个行为菜单。这个行为/动作能切换状态栏显示或者隐藏。
viewStatAct = QAction('View statusbar', self, checkable=True)
用checkable选项创建一个能选中的菜单。
viewStatAct.setChecked(True)
默认设置为选中状态。
def toggleMenu(self, state):

    if state:
        self.statusbar.show()
    else:
        self.statusbar.hide()

  • clicked()用于Button发射的信号
  • triggered()用于QAction发射的信号,原型:void triggered(bool checked = false);
  • toggle()用于ChekBox,非开即关,原型:void toggled(bool);

右键菜单(弹出框)

还是使用contextMenuEvent()方法实现这个菜单
action = cmenu.exec_(self.mapToGlobal(event.pos()))
使用exec_()方法显示菜单。从鼠标右键事件对象中获得当前坐标。mapToGlobal()方法把当前组件的相对坐标转换为窗口(window)的绝对坐标。
if action == quitAct:
    qApp.quit()
如果右键菜单里触发了事件,也就触发了退出事件,执行关闭菜单行为。

import sys
from PyQt5.QtWidgets import QMainWindow, qApp, QMenu, QApplication

class Example(QMainWindow):

    def __init__(self):
        super().__init__()
        self.initUI()
    def initUI(self):
        self.setGeometry(300, 300, 300, 200)
        self.setWindowTitle('Context menu')
        self.show()
    def contextMenuEvent(self, event):
           cmenu = QMenu(self)
           newAct = cmenu.addAction("New")
           opnAct = cmenu.addAction("Open")
           opnAct3 = cmenu.addAction("功能三")
           quitAct = cmenu.addAction("Quit")
           action = cmenu.exec_(self.mapToGlobal(event.pos()))
           if action == quitAct:
               qApp.quit()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

 工具栏

菜单栏包含了所有的命令,工具栏就是常用的命令的集合。

import sys
from PyQt5.QtWidgets import QMainWindow, QAction, qApp, QApplication
from PyQt5.QtGui import QIcon

class Example(QMainWindow):
    def __init__(self):
        super().__init__()
        self.initUI()
    def initUI(self):
        exitAct = QAction(QIcon('exit24.png'), 'Exit', self)
        exitAct.setShortcut('Ctrl+Q')
        exitAct.triggered.connect(qApp.quit)

        self.toolbar = self.addToolBar('Exit')
        self.toolbar.addAction(exitAct)

        self.toolbar = self.addToolBar('工具栏2')
        exitAct2 = QAction('Exit2', self)
        self.toolbar.addAction(exitAct2)

        self.setGeometry(300, 300, 300, 200)
        self.setWindowTitle('Toolbar')
        self.show()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

上面的例子中,我们创建了一个工具栏。这个工具栏只有一个退出应用的动作。
exitAct = QAction(QIcon('exit24.png'), 'Exit', self)
exitAct.setShortcut('Ctrl+Q')
exitAct.triggered.connect(qApp.quit)
和上面的菜单栏差不多,这里使用了一个行为对象,这个对象绑定了一个标签,一个图标和一个快捷键。这些行为被触发的时候,会调用QtGui.QMainWindow的quit方法退出应用。
self.toolbar = self.addToolBar('Exit')
self.toolbar.addAction(exitAct)
用addToolBar()创建工具栏,并用addAction()将动作对象添加到工具栏

主窗口

import sys
from PyQt5.QtWidgets import QMainWindow, QTextEdit, QAction, QApplication
from PyQt5.QtGui import QIcon
class Example(QMainWindow):
    def __init__(self):
        super().__init__()
        self.initUI()
    def initUI(self):
        textEdit = QTextEdit()
        self.setCentralWidget(textEdit)#编辑框

        exitAct = QAction('Exit', self)
        exitAct.setShortcut('Ctrl+Q')
        exitAct.setStatusTip('Exit application')
        exitAct.triggered.connect(self.close)

        # self.statusBar()

        menubar = self.menuBar()#菜单栏
        fileMenu = menubar.addMenu('&File')
        fileMenu.addAction(exitAct)

        toolbar = self.addToolBar('Exit')#工具栏
        toolbar.addAction(exitAct)

        self.setGeometry(300, 300, 350, 250)
        self.setWindowTitle('Main window')
        self.show()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

 上面的代码创建了一个很经典的菜单框架,有右键菜单,工具栏和状态栏。


textEdit = QTextEdit()
self.setCentralWidget(textEdit)
这里创建了一个文本编辑区域,并把它放在QMainWindow的中间区域
这个组件会占满所有剩余的区域。

布局管理

在一个GUI程序里,布局是一个很重要的方面。布局就是如何管理应用中的元素和窗口。有两种方式可以搞定:绝对定位和PyQt5的layout类

绝对定位

每个程序都是以像素为单位区分元素的位置,衡量元素的大小。所以我们完全可以使用绝对定位搞定每个元素和窗口的位置。但是这也有局限性:

  • 元素不会随着我们更改窗口的位置和大小而变化。

  • 不能适用于不同的平台和不同分辨率的显示器

  • 更改应用字体大小会破坏布局

  • 如果我们决定重构这个应用,需要全部计算一下每个元素的位置和大小

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

class Example(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()
    def initUI(self):
        lbl1 = QLabel('Zetcode', self)
        lbl1.move(15, 10)#左上角

        lbl2 = QLabel('tutorials', self)
        lbl2.move(35, 40)

        lbl3 = QLabel('for programmers', self)
        lbl3.move(55, 70)

        lbl3 = QLabel('第四个', self)
        lbl3.move(70, 90)

        self.setGeometry(300, 300, 250, 150)
        self.setWindowTitle('Absolute')
        self.show()
if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

我们使用move()方法定位了每一个元素,使用x、y坐标。x、y坐标的原点是程序的左上角。
lbl1 = QLabel('Zetcode', self)
lbl1.move(15, 10)
这个元素的左上角就在这个程序的左上角开始的(15, 10)的位置

盒布局

使用盒布局能让程序具有更强的适应性。这个才是布局一个应用的更合适的方式。QHBoxLayoutQVBoxLayout是基本的布局类,分别是水平布局和垂直布局。(Horizontal layout and vertical layout)

如果我们需要把两个按钮放在程序的右下角,创建这样的布局,我们只需要一个水平布局加一个垂直布局的盒子就可以了。再用弹性布局增加一点间隙

import sys
from PyQt5.QtWidgets import (QWidget, QPushButton,
    QHBoxLayout, QVBoxLayout, QApplication)

class Example(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()
    def initUI(self):

        okButton = QPushButton("OK")
        cancelButton = QPushButton("Cancel")

        hbox = QHBoxLayout()
        hbox.addStretch(1)
        hbox.addWidget(okButton)
        hbox.addWidget(cancelButton)

        vbox = QVBoxLayout()
        vbox.addStretch(1)
        vbox.addLayout(hbox)

        self.setLayout(vbox)

        self.setGeometry(300, 300, 300, 150)
        self.setWindowTitle('Buttons')
        self.show()
if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

上面的例子完成了在应用的右下角放了两个按钮的需求。当改变窗口大小的时候,它们能依然保持在相对的位置。我们同时使用了QHBoxLayout和QVBoxLayout。
okButton = QPushButton("OK")
cancelButton = QPushButton("Cancel")
这是创建了两个按钮。


hbox = QHBoxLayout()
hbox.addStretch(1)
hbox.addWidget(okButton)
hbox.addWidget(cancelButton)
创建一个水平布局,并增加弹性空间和两个按钮。stretch函数在两个按钮前面增加了一块弹性空间,它会将按钮挤到窗口的右边。
vbox = QVBoxLayout()
vbox.addStretch(1)
vbox.addLayout(hbox)
为了布局需要,我们把这个水平布局放到了一个垂直布局盒里面弹性元素会把水平布局挤到窗口的下边
self.setLayout(vbox)

        hbox = QHBoxLayout()
        hbox.addStretch(1)
        hbox.addWidget(okButton)
        hbox.addWidget(cancelButton)
        self.setLayout(hbox)

        hbox = QVBoxLayout()
        hbox.addStretch(1)
        hbox.addWidget(okButton)
        hbox.addWidget(cancelButton)
        self.setLayout(hbox)

栅格布局(网格布局)

最常用的还是栅格布局了。这种布局是把窗口分为行和列。创建和使用栅格布局,需要使用QGridLayout模块。

import sys
from PyQt5.QtWidgets import (QWidget, QGridLayout,
    QPushButton, QApplication)


class Example(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()
    def initUI(self):
        grid = QGridLayout()
        self.setLayout(grid)

        names = ['Cls', 'Bck', '', 'Close',
                 '7', '8', '9', '/',
                '4', '5', '6', '*',
                 '1', '2', '3', '-',
                '0', '.', '=', '+',
                 '←', '↑', '→', '↓'
                 ]

        positions = [(i,j) for i in range(6) for j in range(4)]

        for position, name in zip(positions, names):
            if name == '':
                continue
            button = QPushButton(name)
            grid.addWidget(button, *position)

        self.move(300, 150)
        self.setWindowTitle('Calculator')
        self.show()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

这个例子里,我们创建了栅格化的按钮。(grid button)
grid = QGridLayout()
self.setLayout(grid)
创建一个QGridLayout实例,并把它放到程序窗口里

names = ['Cls', 'Bck', '', 'Close',
         '7', '8', '9', '/',
        '4', '5', '6', '*',
         '1', '2', '3', '-',
        '0', '.', '=', '+',
         '←', '↑', '→', '↓'
         ]
这是我们将要使用的按钮的名称。
positions = [(i,j) for i in range(6) for j in range(4)]
创建按钮位置列表。
for position, name in zip(positions, names):

    if name == '':
        continue
    button = QPushButton(name)
    grid.addWidget(button, *position)
创建按钮,并使用addWidget()方法把按钮放到布局里面。

制作提交反馈信息的布局

组件能跨列和跨行展示

import sys
from PyQt5.QtWidgets import (QWidget, QLabel, QLineEdit,
    QTextEdit, QGridLayout, QApplication)
class Example(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()
    def initUI(self):
        title = QLabel('Title')
        author = QLabel('Author')
        review = QLabel('Review')
        fujian = QLabel('附件')

        titleEdit = QLineEdit()
        authorEdit = QLineEdit()
        reviewEdit = QTextEdit()
        fujianEdit = QLineEdit('拖文件到这里,默认为空')

        grid = QGridLayout()
        grid.setSpacing(10)#设置每个组件空间

        grid.addWidget(title, 1, 0)
        grid.addWidget(titleEdit, 1, 1)

        grid.addWidget(author, 2, 0)
        grid.addWidget(authorEdit, 2, 1)

        grid.addWidget(review, 3,0)
        grid.addWidget(reviewEdit, 3, 1)

        grid.addWidget(fujian, 5, 0)
        grid.addWidget(fujianEdit, 5, 1)

        self.setLayout(grid)

        self.setGeometry(300, 300, 350, 300)
        self.setWindowTitle('Review')
        self.show()
if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

 我们创建了一个有三个标签的窗口。两个行编辑和一个文版编辑,这是用QGridLayout模块搞定的。
grid = QGridLayout()
grid.setSpacing(10)
创建标签之间的空间。
grid.addWidget(reviewEdit, 3, 1, 5, 1) 后面四个参数起始行,起始列,占用行,占用列
我们可以指定组件的跨行和跨列的大小。这里我们指定这个元素跨5行显示。



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值