百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT文章 > 正文

Python GUI开发- PyQt5 开发小工具环境入门

chenpack 2025-06-26 12:30 23 浏览 0 评论

PyQt5 库:强大的 Python GUI 开发利器

一、引言

在 Python 的众多应用领域中,图形用户界面(GUI)开发是一个重要的方面。PyQt5 库作为一个功能强大且广泛应用的 GUI 框架,为开发者提供了丰富的工具和组件,使得创建交互式、美观的应用程序变得更加便捷。无论是简单的桌面工具还是复杂的商业应用,PyQt5 都能发挥重要作用。本文将详细介绍 PyQt5 库的相关知识,并通过 5 个实例展示其实际应用。

二、PyQt5 库概述

PyQt5 是一套 Python 绑定的 Qt5 应用程序框架,它允许 Python 开发者使用 Qt 的强大功能来创建 GUI 应用程序。Qt 是一个跨平台的 C++ 框架,拥有丰富的类库和工具,用于开发各种类型的应用程序。PyQt5 将这些功能封装成 Python 可调用的形式,使得 Python 程序员能够轻松地进行 GUI 开发。

Python GUI开发- PyQt5 开发小工具环境入门


(一)安装 PyQt5

在使用 PyQt5 之前,需要先进行安装。可以通过 pip 命令来安装:

pip install PyQt5

(二)基本概念

  1. 信号与槽
  • 信号(Signal):是对象发出的事件通知。当一个对象的内部状态发生改变时,它可以发射一个信号。
  • 槽(Slot):是一个可调用的函数,用于接收信号并进行相应的处理。连接信号与槽:通过 connect 方法将信号与槽连接起来,当信号发射时,与之连接的槽函数就会被调用。

2.窗口与组件

  • QWidget:是所有用户界面类的基类,它提供了基本的窗口和组件功能。
  • 常见的组件如 QLabel(标签)、QPushButton(按钮)、QLineEdit(文本输入框)、QComboBox(下拉列表框)等,它们都继承自 QWidget,可以在窗口中进行布局和交互。

(三)库函数示例

以下是一个简单的 PyQt5 程序示例,展示了一个窗口和一个按钮,点击按钮时会改变窗口的标题:

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

# 创建一个应用程序对象
app = QApplication(sys.argv)

# 创建一个窗口
window = QWidget()

# 创建一个按钮
button = QPushButton("点击我", window)

# 将按钮的点击信号与槽函数连接
button.clicked.connect(self.change_window_title)

# 定义槽函数,用于改变窗口标题
@pyqtSlot()
def change_window_title():
    window.setWindowTitle("标题已改变")

# 显示窗口
window.show()

# 运行应用程序的主循环
sys.exit(app.exec_())

在这个示例中:

  • 首先导入了必要的模块,包括 QApplication(用于管理应用程序的生命周期)、QWidget(窗口基类)、QPushButton(按钮类)和 pyqtSlot(用于标记槽函数)。
  • 创建了一个 QApplication 对象 app,它是应用程序的入口点。
  • 创建了一个 QWidget 对象 window 作为窗口。
  • 创建了一个 QPushButton 对象 button,并将其添加到窗口中。通过 clicked 信号与 change_window_title 槽函数连接,当按钮被点击时,槽函数会被调用。
  • change_window_title 函数用于改变窗口的标题。
  • 最后,显示窗口并运行应用程序的主循环,使应用程序持续运行并处理事件。

三、实例一:简单计算器

(一)功能需求

实现一个基本的四则运算计算器,能够进行加法、减法、乘法和除法运算,支持用户输入数字和运算符,点击 “=” 按钮计算结果并显示在界面上。

(二)代码实现

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QGridLayout, QLabel, QLineEdit, QPushButton
from PyQt5.QtCore import Qt

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

    def initUI(self):
        # 创建网格布局
        grid = QGridLayout()

        # 显示结果的标签
        self.result_label = QLabel("0", self)
        self.result_label.setAlignment(Qt.AlignRight)
        grid.addWidget(self.result_label, 0, 0, 1, 4)

        # 数字按钮
        buttons = [
            ('7', 1, 0), ('8', 1, 1), ('9', 1, 2), ('/', 1, 3),
            ('4', 2, 0), ('5', 2, 1), ('6', 2, 2), ('*', 2, 3),
            ('1', 3, 0), ('2', 3, 1), ('3', 3, 2), ('-', 3, 3),
            ('0', 4, 0), ('.', 4, 1), ('=', 4, 2), ('+', 4, 3)
        ]

        for button_text, row, col in buttons:
            button = QPushButton(button_text, self)
            grid.addWidget(button, row, col)
            button.clicked.connect(self.button_clicked)

        self.setLayout(grid)
        self.setWindowTitle("简单计算器")

    def button_clicked(self):
        sender = self.sender()
        button_text = sender.text()

        if button_text == "=":
            try:
                expression = self.result_label.text()
                result = eval(expression)
                self.result_label.setText(str(result))
            except Exception as e:
                self.result_label.setText("错误: " + str(e))
        else:
            current_text = self.result_label.text()
            if current_text == "0" and button_text not in ['.', '+', '-', '*', '/']:
                self.result_label.setText(button_text)
            else:
                self.result_label.setText(current_text + button_text)

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

(三)代码注释

  1. 首先导入必要的模块,包括 QApplication、QWidget、QGridLayout(用于网格布局)、QLabel(用于显示结果)、QLineEdit(本示例中未使用,但可用于输入更复杂的表达式)、QPushButton 和 Qt(用于对齐方式等)。
  2. 定义 Calculator 类继承自 QWidget。initUI 方法用于初始化界面:创建一个 QGridLayout 对象 grid 用于布局组件。创建一个 QLabel 对象 result_label 用于显示计算结果,设置其初始值为 "0" 并右对齐,然后将其添加到网格布局的第一行,占据四列。定义一个按钮列表 buttons,包含数字和运算符以及它们在网格布局中的位置信息。遍历按钮列表,创建每个按钮 button,将其添加到网格布局中对应的位置,并连接其 clicked 信号到 button_clicked 槽函数。最后将网格布局设置为窗口的布局,并设置窗口标题。button_clicked 方法是槽函数,用于处理按钮点击事件:获取发送信号的按钮对象 sender,并获取其文本 button_text。如果点击的是 "=" 按钮,尝试使用 eval 函数计算当前显示在结果标签中的表达式,并将结果显示在标签中,如果出现错误则显示错误信息。如果点击的是其他按钮,根据当前结果标签的文本内容进行相应处理,如果当前是 "0" 且点击的不是特殊字符(如小数点、运算符等),则直接将按钮文本设置为结果标签的内容,否则将按钮文本追加到当前结果标签的文本后面。
  3. 在 if __name__ == '__main__': 条件下,创建应用程序对象 app,实例化 Calculator 类并显示窗口,然后运行应用程序的主循环。

四、实例二:待办事项列表

(一)功能需求

创建一个简单的待办事项列表应用程序,用户可以输入待办事项,点击 “添加” 按钮将其添加到列表中,完成事项后可以点击 “删除” 按钮将其从列表中移除。

(二)代码实现


import sys
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QHBoxLayout, QListWidget, QLineEdit, QPushButton

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

    def initUI(self):
        # 垂直布局
        vbox = QVBoxLayout()

        # 水平布局用于输入框和按钮
        hbox = QHBoxLayout()

        # 待办事项列表
        self.todo_list = QListWidget()

        # 输入框
        self.entry = QLineEdit()

        # 添加按钮
        add_button = QPushButton("添加")
        add_button.clicked.connect(self.add_item)

        # 删除按钮
        delete_button = QPushButton("删除")
        delete_button.clicked.connect(self.delete_item)

        # 将组件添加到水平布局
        hbox.addWidget(self.entry)
        hbox.addWidget(add_button)
        hbox.addWidget(delete_button)

        # 将水平布局和列表添加到垂直布局
        vbox.addLayout(hbox)
        vbox.addWidget(self.todo_list)

        self.setLayout(vbox)
        self.setWindowTitle("待办事项列表")

    def add_item(self):
        text = self.entry.text()
        if text:
            self.todo_list.addItem(text)
            self.entry.clear()

    def delete_item(self):
        selected_items = self.todo_list.selectedItems()
        for item in selected_items:
            self.todo_list.takeItem(self.todo_list.row(item))

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

(三)代码注释

  1. 导入必要的模块,包括 QApplication、QWidget、QVBoxLayout(垂直布局)、QHBoxLayout(水平布局)、QListWidget(列表组件)、QLineEdit(输入框)和 QPushButton。
  2. 定义 ToDoList 类继承自 QWidget。initUI 方法初始化界面:创建一个 QVBoxLayout 对象 vbox 用于整体垂直布局。创建一个 QHBoxLayout 对象 hbox 用于输入框和按钮的水平布局。创建一个 QListWidget 对象 todo_list 用于显示待办事项列表。创建一个 QLineEdit 对象 entry 用于用户输入待办事项。创建 “添加” 按钮 add_button 并连接其 clicked 信号到 add_item 槽函数,创建 “删除” 按钮 delete_button 并连接其 clicked 信号到 delete_item 槽函数。将输入框、添加按钮和删除按钮添加到水平布局 hbox 中,然后将水平布局和待办事项列表添加到垂直布局 vbox 中,最后将垂直布局设置为窗口的布局,并设置窗口标题。add_item 方法是槽函数,用于添加待办事项:获取输入框中的文本 text,如果不为空,则将其添加到待办事项列表中,并清空输入框。delete_item 方法是槽函数,用于删除选中的待办事项:获取选中的事项 selected_items,遍历选中的事项,通过 takeItem 方法根据行号从列表中移除。
  3. 在主程序部分,创建应用程序对象 app,实例化 ToDoList 类并显示窗口,然后运行应用程序的主循环。

五、实例三:图像浏览器

(一)功能需求

实现一个简单的图像浏览器,能够显示指定文件夹中的图像文件列表,用户点击列表中的图像文件名时,在窗口中显示相应的图像。

(二)代码实现

import sys
import os
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QListWidget, QLabel, QPushButton
from PyQt5.QtGui import QPixmap
from PyQt5.QtCore import Qt

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

    def initUI(self):
        # 垂直布局
        vbox = QVBoxLayout()

        # 图像列表
        self.image_list = QListWidget()
        self.image_list.itemClicked.connect(self.show_image)

        # 显示图像的标签
        self.image_label = QLabel()
        self.image_label.setAlignment(Qt.AlignCenter)

        # 上一张按钮
        prev_button = QPushButton("上一张")
        prev_button.clicked.connect(self.show_previous_image)

        # 下一张按钮
        next_button = QPushButton("下一张")
        next_button.clicked.connect(self.show_next_image)

        # 将组件添加到布局
        vbox.addWidget(self.image_list)
        vbox.addWidget(self.image_label)
        vbox.addWidget(prev_button)
        vbox.addWidget(next_button)

        self.setLayout(vbox)
        self.setWindowTitle("图像浏览器")

        # 加载图像文件列表
        self.load_image_files()

    def load_image_files(self):
        # 假设图像文件在当前目录的 "images" 文件夹中
        image_folder = "images"
        if os.path.exists(image_folder):
            for file in os.listdir(image_folder):
                if file.endswith(('.jpg', '.png', '.jpeg')):
                    self.image_list.addItem(file)

    def show_image(self, item):
        image_path = os.path.join("images", item.text())
        pixmap = QPixmap(image_path)
        self.image_label.setPixmap(pixmap.scaled(self.image_label.size(), Qt.KeepAspectRatio))

    def show_previous_image(self):
        current_row = self.image_list.currentRow()
        if current_row > 0:
            self.image_list.setCurrentRow(current_row - 1)
            self.show_image(self.image_list.currentItem())

    def show_next_image(self):
        current_row = self.image_list.currentRow()
        if current_row < self.image_list.count() - 1:
            self.image_list.setCurrentRow(current_row + 1)
            self.show_image(self.image_list.currentItem())

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

六、实例四:《功能丰富的 PyQt5 文本编辑器》

(一)功能需求

  1. 提供一个直观的用户界面,用于文本的输入、编辑和查看。
  2. 实现基本的文本编辑操作,包括输入文字、删除文字、选择文本、复制、粘贴、剪切等。
  3. 具备打开本地文本文件的功能,支持多种常见的文本文件格式(如 .txt、.md 等),并能正确显示文件内容。
  4. 能够将编辑后的文本保存到本地文件,保存时可选择保存路径和文件名。
  5. 提供一些常用的编辑功能快捷键,例如复制(Ctrl + C)、粘贴(Ctrl + V)、剪切(Ctrl + X)、保存(Ctrl + S)等,以提高用户编辑效率。
  6. 在界面上显示当前文件的路径和状态信息,例如是否已保存、是否有未保存的修改等。

(二)代码实现

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QTextEdit, QMenuBar, QFileDialog, QStatusBar
from PyQt5.QtGui import QIcon
from PyQt5.QtCore import Qt, QObject, pyqtSignal

class TextEditor(QWidget):
    # 定义信号,用于通知主窗口文本是否有修改
    text_changed_signal = pyqtSignal(bool)

    def __init__(self):
        super().__init__()
        self.initUI()
        self.init_connections()
        self.file_path = None
        self.is_text_modified = False

    def initUI(self):
        # 垂直布局
        vbox = QVBoxLayout()

        # 文本编辑区
        self.text_edit = QTextEdit()
        self.text_edit.setAcceptRichText(False)  # 不接受富文本格式,只处理纯文本

        # 菜单栏
        menu_bar = QMenuBar()
        file_menu = menu_bar.addMenu("文件")

        # 打开文件动作
        open_action = file_menu.addAction("打开")
        open_action.setIcon(QIcon("open_icon.png"))  
        open_action.triggered.connect(self.open_file)

        # 保存文件动作
        save_action = file_menu.addAction("保存")
        save_action.setIcon(QIcon("save_icon.png"))  
        save_action.triggered.connect(self.save_file)

        # 另存为文件动作
        save_as_action = file_menu.addAction("另存为")
        save_as_action.triggered.connect(self.save_file_as)

        # 编辑菜单
        edit_menu = menu_bar.addMenu("编辑")

        # 复制动作
        copy_action = edit_menu.addAction("复制")
        copy_action.setShortcut(Qt.CTRL + Qt.Key_C)
        copy_action.triggered.connect(self.text_edit.copy)

        # 粘贴动作
        paste_action = edit_menu.addAction("粘贴")
        paste_action.setShortcut(Qt.CTRL + Qt.Key_V)
        paste_action.triggered.connect(self.text_edit.paste)

        # 剪切动作
        cut_action = edit_menu.addAction("剪切")
        cut_action.setShortcut(Qt.CTRL + Qt.Key_X)
        cut_action.triggered.connect(self.text_edit.cut)

        # 撤销动作
        undo_action = edit_menu.addAction("撤销")
        undo_action.setShortcut(Qt.CTRL + Qt.Key_Z)
        undo_action.triggered.connect(self.text_edit.undo)

        # 重做动作
        redo_action = edit_menu.addAction("重做")
        redo_action.setShortcut(Qt.CTRL + Qt.Key_Y)
        redo_action.triggered.connect(self.text_edit.redo)

        # 状态栏
        self.status_bar = QStatusBar()
        self.setStatusBar(self.status_bar)

        # 将文本编辑区和菜单栏添加到布局
        vbox.addWidget(menu_bar)
        vbox.addWidget(self.text_edit)

        self.setLayout(vbox)
        self.setWindowTitle("文本编辑器")

    def init_connections(self):
        # 连接文本编辑区的信号与槽函数,用于检测文本是否修改
        self.text_edit.textChanged.connect(self.text_changed)

    def text_changed(self):
        self.is_text_modified = True
        self.update_status_bar()
        self.text_changed_signal.emit(True)

    def update_status_bar(self):
        if self.file_path:
            status_text = f"文件路径: {self.file_path} - 是否已保存: {'是' if not self.is_text_modified else '否'}"
        else:
            status_text = "未打开文件 - 是否已保存: {'是' if not self.is_text_modified else '否'}"
        self.status_bar.showMessage(status_text)

    def open_file(self):
        file_name, _ = QFileDialog.getOpenFileName(self, "打开文件", "", "文本文件 (*.txt *.md);;所有文件 (*)")
        if file_name:
            self.file_path = file_name
            with open(file_name, 'r', encoding='utf-8') as file:
                self.text_edit.setPlainText(file.read())
            self.is_text_modified = False
            self.update_status_bar()

    def save_file(self):
        if self.file_path:
            with open(self.file_path, 'w', encoding='utf-8') as file:
                file.write(self.text_edit.toPlainText())
            self.is_text_modified = False
            self.update_status_bar()
        else:
            self.save_file_as()

    def save_file_as(self):
        file_name, _ = QFileDialog.getSaveFileName(self, "保存文件", "", "文本文件 (*.txt *.md);;所有文件 (*)")
        if file_name:
            self.file_path = file_name
            with open(file_name, 'w', encoding='utf-8') as file:
                file.write(self.text_edit.toPlainText())
            self.is_text_modified = False
            self.update_status_bar()

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


七、实例五:登录界面

(一)功能需求

实现一个简单的登录界面,用户输入用户名和密码,点击 “登录” 按钮后,验证用户名和密码是否正确,如果正确则显示登录成功提示,否则显示错误提示。

(二)代码实现


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

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

    def initUI(self):
        # 垂直布局
        vbox = QVBoxLayout()

        # 用户名标签和输入框
        username_label = QLabel("用户名:")
        self.username_edit = QLineEdit()

        # 密码标签和输入框
        password_label = QLabel("密码:")
        self.password_edit = QLineEdit()
        self.password_edit.setEchoMode(QLineEdit.Password)

        # 登录按钮
        login_button = QPushButton("登录")
        login_button.clicked.connect(self.login)

        # 将组件添加到布局
        vbox.addWidget(username_label)
        vbox.addWidget(self.username_edit)
        vbox.addWidget(password_label)
        vbox.addWidget(self.password_edit)
        vbox.addWidget(login_button)

        self.setLayout(vbox)
        self.setWindowTitle("登录界面")

    def login(self):
        username = self.username_edit.text()
        password = self.password_edit.text()

        # 这里假设正确的用户名和密码为 "admin" 和 ""
        if username == "admin" and password == "":
            QMessageBox.information(self, "登录成功", "欢迎登录!")
        else:
            QMessageBox.warning(self, "错误", "用户名或密码错误!")

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


(三)代码注释

  1. 导入必要的模块,包括 QApplication、QWidget、QVBoxLayout、QLabel、QLineEdit(用于输入用户名和密码)、QPushButton(登录按钮)、QMessageBox(用于显示提示信息)和 Qt。
  2. 定义 LoginForm 类继承自 QWidget。initUI 方法初始化界面:创建一个 QVBoxLayout 对象 vbox 用于垂直布局。创建用户名标签 username_label 和输入框 username_edit。创建密码标签 password_label 和输入框 password_edit,并设置其显示模式为密码模式(输入内容显示为星号)。创建登录按钮 login_button,连接其 clicked 信号到 login 槽函数。将组件添加到垂直布局中,最后将布局设置为窗口的布局,并设置窗口标题。login 方法是槽函数,用于处理登录操作:获取用户输入的用户名 username 和密码 password。这里假设正确的用户名和密码为 "admin" 和 "",进行简单的验证。如果用户名和密码正确,使用 QMessageBox.information 显示登录成功提示;如果错误,使用 QMessageBox.warning 显示错误提示。
  3. 在主程序部分,创建应用程序对象 app,实例化 LoginForm 类并显示窗口,然后运行应用程序的主循环。

八、结束语

通过以上对 PyQt5 库的介绍以及五个实例的展示,我们可以看到 PyQt5 在 Python GUI 开发中的强大功能和灵活性。无论是简单的计算器、待办事项列表,还是较为复杂的图像浏览器、文本编辑器和登录界面,都可以通过 PyQt5 相对轻松地实现。

相关推荐

讲真,网络工程师家里的wifi速度到底能有多快?

讲真,网络工程师家里的wifi速度到底能有多快?老杨身边挺多亲戚朋友总有这样的问题,wifi已经买的很高级了,可以信号还是不好。但是这件事情,对于咱们网络工程师来说,就是小case了。老杨今天就来解释...

RouterOS 端口映射 (远程桌面)

一款功能强大的路由器系统-软路由-RouterOS推荐一款路由器系统,头条有很多喜欢使用软路由伙伴可能有很多都不知道RouterOS这个路由系统是,RouterOS是由拉脱维亚MikroTik...

神经网络中的编码器 神经网络视频编码

神经网络算法-一文搞懂Transformer(总体架构&三种注意力层)本文将从Transformer的本质、Transformer的原理、Transformer的应用三个方面,带您一...

必备资料103个WindowsXP运行命令

Windows中CMD最全命令行CMD命令:开始->运行(或者Windows+R)->键入cmd或command(在命令行里可以看到系统版本、文件系统版本)CMD命令锦集1.gpedit...

固态硬盘无法格式化怎么办

Windows中固态硬盘无法格式化怎么办?固态硬盘(简称SSD)是一种数据存储设备,与传统机械硬盘相比,它在许多方面表现得更好。因此,越来越多的用户希望使用固态硬盘,但是当人们购买固态硬盘后准备将其格...

手机信令数据分析_手机信令数据分析过程代码

清华大学公共管理学院刘志林教授:探索手机信令数据在城市治理中的应用中国发展网讯日前,由中国人民大学首都发展与战略研究院(以下简称“首发院”)主办的首都大讲堂(第7期)暨地方治理工作坊第二期在京举办。...

python开发ping工具 ipad python开发工具

python之ping主机#coding=utf-8frompythonpingimportpingforiinrange,):ip=&#;.&#;+str(i)...

云容灾关键技术点简介_云容器技术

阿里云发布企业级云灾备解决方案:一键容灾、成本节省%5月日,阿里云对外发布了企业级云灾备解决方案。据介绍,此次发布的灾备解决方案来自阿里巴巴IT基础设施云化的灾备经验,完全省去灾备机房的建设规划,可大...

域名泛解析设置_域名解析包括泛域名解析

如何降低域名被恶意泛解析的风险买车用车不想被忽悠,就请关注缸微信号:kf12gang←长按可复制。我们每天将免费为您解答选车用车的相关问题。作者:QQ126058域名被恶意泛解析是域名安全最常见的问...

人人通云平台怎么注册 人人通云教学登录账号

世界那么大,她看到了:一个心理咨询师的十年心灵之旅来源:环球网“世界那么大,我想去看看。”十年前的那个春天,十个字的辞职信,戳中了无数国人的心,激起了无数个“诗和远方”的小梦想,被称为“史上最具情怀...

民用远程监控手机软件_民用远程监控手机软件下载

屏幕监控软件有哪些?3款好用的监控软件分享!管控摸鱼小case!作为企业管理者,我深知员工工作效率和信息安全的重要性。在日常管理中,我时常会遇到这样的难题:员工是否在认真工作?有没有利用公司资源做与工...

重量级!Maven史上最全教程,看了必懂

对8个MCP服务器框架的比较作者:FrankGoortani编译:小兰引言模型上下文协议(MCP)是一种新标准,用于以统一方式将AI助手(如LLM)与外部数据源和工具连接起来。自推出以来,各种框架已...

面试字节跳动,收到offer后我却拒绝了 ,给面试人的一些忠告!

面试字节跳动,我被面试官狂怼全过程!来源:https://www.zhihu.com/question//answer/人们都说,这个世界上有两种人注定单身,一种是太优秀的,另一种是太平凡的。我一听呀...

ps1手柄 python Ps1手柄真假

别再花冤枉钱!教你一分钟辨别“真假”超皮秒▌什么是超皮秒?皮秒激光,就是每个激光发射的脉冲持续时间(脉宽)达到皮秒级别的激光;1ps等于的负次方秒,超皮秒其实是一种商业名称,本质上也是皮秒激光设备,我...

路由器接交换机UPLINK还是

最全攻略!网络小白也能看懂的交换机连接方法号主:老杨丨年资深网络工程师,更多网工提升干货,请关注公众号:网络工程师俱乐部中午好,我的网工朋友。在网络设备的世界里,交换机是不可或缺的存在。不同的连接方法...

取消回复欢迎 发表评论: