PyQt5

Qt是基于C++实现的GUI,而PyQt就是用python调用Qt.

PyQt中有很多的功能模块,开发最常用的模块功能主要有3个

1) QtCore:包含核心的非GHI的功能,主要和时间,文件与文件夹,各种数据,流,URLs,进程与线程一起使用

2) QtGUi:包含窗口系统,事件处理,2D图像,基本绘画,字体和文字类

3) QtWidget:包含了一些创建桌面应用的UI元素

Qt for Python Quick start — Qt for Python

1. 安装环境

1.1 创建虚拟环境

1.2 安装PyQt5库

1.3 安装PyQt5时报错,

下载工具,进行安装  Microsoft C++ 生成工具 - Visual Studio

 

2.基本UI

# _*_ coding:utf-8 _*_
# @Time  :  16:41
# @Author: george
# @File  : 基本UI.py
# @Comment: ***
import sys
from PyQt5.QtWidgets import QApplication, QWidget

if __name__ == '__main__':
    # 创建QApplication对象-传递列表给QApplication类,这个参数一般是当前程序对象运行环境参数
    app = QApplication(sys.argv)
    # 创建界面对象
    w = QWidget()
    # 设置窗口标题
    w.setWindowTitle("第一个PyQt")
    # 展示窗口
    w.show()
    # 程序进入循环等待状态,事件监测循环
    app.exec_()

效果图

3.组件

3.1 Button

# _*_ coding:utf-8 _*_
# @Time  :  17:16
# @Author: george
# @File  : 按钮.py
# @Comment: ***
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton
if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = QWidget()
    w.setWindowTitle("第一个PyQt程序")
    # 创建button
    btn = QPushButton("按钮")
    # 将按钮放入窗口显示
    btn.setParent(w)
    w.show()
    app.exec_()

效果图:

3.2 Label

# _*_ coding:utf-8 _*_
# @Time  :  17:29
# @Author: george
# @File  : label.py
# @Comment: ***
import sys
from PyQt5.QtWidgets import QLabel, QWidget,QApplication,QPushButton

if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = QWidget()
    w.setWindowTitle('label')
    # 在创建对象的时候指定父对象
    btn = QPushButton('btn',w)
    lab = QLabel('账号',w)
    # 设置显示位置与大小,x,y,w,h
    lab.setGeometry(20,20,300,40)
    w.show()
    app.exec_()

 效果图:

 3.3 LineEdit

# _*_ coding:utf-8 _*_
# @Time  :  19:04
# @Author: george
# @File  : lineEdit.py
# @Comment: ***
import sys
from PyQt5.QtWidgets import QWidget, QLineEdit, QPushButton, QApplication, QLabel

if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = QWidget()
    w.setWindowTitle('lineedit')
    # 标签
    lab = QLabel('账号', w)
    lab.setGeometry(20, 20, 30, 20)
    # 输入框
    edit = QLineEdit(w)
    edit.setPlaceholderText("请输入账号")
    edit.setGeometry(55, 20, 330, 20)
    # 按钮
    btn = QPushButton('注册', w)
    btn.setGeometry(55, 50, 30, 20)

    w.show()
    app.exec_()

效果图:

3.4 窗口设置

窗口大小,背景图,自动居中等相关设置

# _*_ coding:utf-8 _*_
# @Time  :  19:04
# @Author: george
# @File  : lineEdit.py
# @Comment: ***
import sys
from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import QWidget, QLineEdit, QPushButton, QApplication, QLabel,QDesktopWidget

if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = QWidget()
    w.setWindowTitle('lineedit')
    # 调整窗口大小
    w.resize(800, 600)
    # 将窗口移动到屏幕0,0位置
    w.move(0,0)
    # 自动将app显示在屏幕中间
    x,y,width,high = QDesktopWidget().availableGeometry().getRect()
    app_x,app_y,app_width,app_high = w.frameGeometry().getRect()
    w.move(width//2-app_width//2,high//2-app_high//2)
    # 设置标题栏图标
    w.setWindowIcon(QIcon("pyq.png"))
    # 标签
    lab = QLabel('账号', w)
    lab.setGeometry(20, 20, 30, 20)
    # 输入框
    edit = QLineEdit(w)
    edit.setPlaceholderText("请输入账号")
    edit.setGeometry(55, 20, 330, 20)
    # 按钮
    btn = QPushButton('注册', w)
    btn.setGeometry(55, 50, 30, 20)

    w.show()
    app.exec_()

 效果图:

4.布局

在Qt里面布局分为四大类

QBoxLayout,QGridLayout,QFormLayout,QStackedLayout

 4.1 QBoxLayout 盒子布局

4.1.1 垂直布局器

盒子布局,一般使用QHBoxLayout(水平) 和QVBoxLayout(垂直布局)两个子类 

创建布局器->使用布局器->将组件添加到布局器里面

# _*_ coding utf-8 _*_
# george
# time: 2024/3/14下午5:54
# name: 垂直布局.py
# comment:
import sys

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


class MyWindow(QWidget):
    def __init__(self):
        super().__init__()  # 一定要调用父类的__init__方法,因为它里面有很多对于UI空间的初始化操作
        # 设置大小
        self.resize(300, 300)
        # 设置标题
        self.setWindowTitle("垂直布局")

        # 垂直布局,创建布局器,是一种约束
        layout = QVBoxLayout()

        # 按钮1
        btn1 = QPushButton("按钮1")
        # 将btn1添加到布局器里面,不需要再设置父对象
        layout.addWidget(btn1)

        # 按钮2
        btn2 = QPushButton("按钮2")
        layout.addWidget(btn2)

        # 按钮3
        btn3 = QPushButton("按钮3")
        layout.addWidget(btn3)

        # 让当前窗口使用这个布局器(排列规则)
        self.setLayout(layout)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = MyWindow()
    w.show()
    app.exec()

默认情况下,三个按钮的布局距离是平均分配 

# _*_ coding utf-8 _*_
# george
# time: 2024/3/14下午5:54
# name: 垂直布局.py
# comment:
import sys

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


class MyWindow(QWidget):
    def __init__(self):
        super().__init__()  # 一定要调用父类的__init__方法,因为它里面有很多对于UI空间的初始化操作
        # 设置大小
        self.resize(300, 300)
        # 设置标题
        self.setWindowTitle("垂直布局")

        # 垂直布局,创建布局器,是一种约束
        layout = QVBoxLayout()

        # 按钮1
        btn1 = QPushButton("按钮1")
        # 将btn1添加到布局器里面,不需要再设置父对象
        layout.addWidget(btn1)

        # 按钮2
        btn2 = QPushButton("按钮2")
        layout.addWidget(btn2)

        # 按钮3
        btn3 = QPushButton("按钮3")
        layout.addWidget(btn3)

        # 添加伸缩器(理解为一个弹簧),这个参数2指的是比例关系,是占据的空间距离比
        layout.addStretch(2)

        # 让当前窗口使用这个布局器(排列规则)
        self.setLayout(layout)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = MyWindow()
    w.show()
    app.exec()

4.1.2 水平布局器

# _*_ coding utf-8 _*_
# george
# time: 2024/3/14下午5:54
# name: 垂直布局.py
# comment:
import sys

from PyQt5.QtWidgets import QWidget, QApplication, QHBoxLayout, QPushButton


class MyWindow(QWidget):
    def __init__(self):
        super().__init__()  # 一定要调用父类的__init__方法,因为它里面有很多对于UI空间的初始化操作
        # 设置大小
        self.resize(300, 300)
        # 设置标题
        self.setWindowTitle("水平布局")

        # 垂直布局,创建布局器,是一种约束
        layout = QHBoxLayout()

        # 按钮1
        btn1 = QPushButton("按钮1")
        # 将btn1添加到布局器里面,不需要再设置父对象
        layout.addWidget(btn1)

        # 按钮2
        btn2 = QPushButton("按钮2")
        layout.addWidget(btn2)

        # 按钮3
        btn3 = QPushButton("按钮3")
        layout.addWidget(btn3)

        # 添加伸缩器(理解为一个弹簧),这个参数2指的是比例关系,是占据的空间距离比
        layout.addStretch(3)

        # 让当前窗口使用这个布局器(排列规则)
        self.setLayout(layout)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = MyWindow()
    w.show()
    app.exec()

4.12.3 布局嵌套

# _*_ coding utf-8 _*_
# george
# time: 2024/3/14下午6:59
# name: 布局器嵌套.py
# comment:
import sys

from PyQt5.QtWidgets import QApplication, QWidget, QHBoxLayout, QVBoxLayout, QLabel, QRadioButton


class MyQwidget(QWidget):
    def __init__(self):
        super(MyQwidget, self).__init__()
        full_layout = QVBoxLayout()
        top_layout = QVBoxLayout()
        lab1 = QLabel("爱好")
        q1 = QRadioButton("抽烟")
        q2 = QRadioButton("喝酒")
        q3 = QRadioButton("烫头")
        top_layout.addWidget(lab1)
        top_layout.addWidget(q1)
        top_layout.addWidget(q2)
        top_layout.addWidget(q3)
        full_layout.addLayout(top_layout)
        lab2 = QLabel("性别")
        full_layout.addWidget(lab2)

        botoom_layout = QHBoxLayout()
        q4 = QRadioButton("男")
        q5 = QRadioButton("女")
        botoom_layout.addWidget(q4)
        botoom_layout.addWidget(q5)

        full_layout.addLayout(botoom_layout)
        self.setLayout(full_layout)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = MyQwidget()
    w.show()
    app.exec()

 

注意:  self.setLayout(full_layout),都是对象设置布局器,所以对于上下两个布局,也是需要两个被设置对象的.所以上面写的代码是有问题的,需要盒子

hobby_box = QGroupBox("爱好")

# _*_ coding utf-8 _*_
# george
# time: 2024/3/15下午1:37
# name: 布局嵌套2.0.py
# comment:
import sys

from PyQt5.QtWidgets import *


class MyWindows(QWidget):
    def __init__(self):
        super(MyWindows, self).__init__()
        self.init_UI()

    def init_UI(self):
        # 最外层的垂直布局,包含爱好和性别
        container = QVBoxLayout()

        # 创建第一个组,添加第一个组件,
        # v_layout保证3个爱好是垂直摆放
        v_layout = QVBoxLayout()
        hobby_box = QGroupBox("爱好")
        btn1 = QRadioButton("抽烟")
        btn2 = QRadioButton("喝酒")
        btn3 = QRadioButton("烫头")
        # 将三个btn添加到v_layout里面
        v_layout.addWidget(btn1)
        v_layout.addWidget(btn2)
        v_layout.addWidget(btn3)
        hobby_box.setLayout(v_layout)

        # 创建第二个组,添加多个组件
        # 性别组
        h_layout = QHBoxLayout()
        gender_box = QGroupBox("性别")
        btn4 = QRadioButton("男")
        btn5 = QRadioButton("女")
        h_layout.addWidget(btn4)
        h_layout.addWidget(btn5)
        gender_box.setLayout(h_layout)

        # 将爱好的内容添加到容器中
        container.addWidget(hobby_box)
        container.addWidget(gender_box)

        # 设置窗口显示的内容是最外层容器
        self.setLayout(container)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MyWindows()
    window.show()
    app.exec_()

4.2 QGridLayout 网格布局 

# _*_ coding utf-8 _*_
# george
# time: 2024/3/15下午2:03
# name: 网格布局.py
# comment:
import sys

from PyQt5.QtWidgets import *


class MyWindow(QWidget):
    def __init__(self):
        super(MyWindow, self).__init__()
        self.initUI()

    def initUI(self):
        # 设置标题头
        self.setWindowTitle("计算器")

        # 准备数据
        data = {
            0: ["7", "8", "9", "+", "("],
            1: ["4", "5", "6", "-", ")"],
            2: ["1", "2", "3", "*", "<-"],
            3: ["0", ".", "=", "/", "C"]
    }

        # 整体设置垂直布局
        layout = QVBoxLayout()

        # 设置输入框
        edit = QLineEdit()
        edit.setPlaceholderText("请输入内容")
        # 将输入框添加到容器中
        layout.addWidget(edit)

        # 网格布局
        grid = QGridLayout()

        # 循环创建btn
        for row_number,data_list in data.items():
            for col_number,i in enumerate(data_list):
                btn = QPushButton(i)
                grid.addWidget(btn,row_number,col_number)

        # 将网格布局追加到容器中
        layout.addLayout(grid)

        # 设置最外层容器的布局为垂直布局
        self.setLayout(layout)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = MyWindow()
    w.show()
    app.exec()

4.3 QFormaLayout

一般适用于提交form表单,比如:登陆,注册等类似场景

4.4 StackedLayout 抽屉布局

提供了多页面切换的布局,一次只能看到一个界面,抽屉布局 

对于抽屉布局器而言就是,一个widget使用了抽屉布局器,而抽屉布局器里面有2个或是多个子widget,这里面的子widget就是将要显示的界面.

# _*_ coding utf-8 _*_
# george
# time: 2024/3/15下午3:12
# name: 抽屉布局.py
# comment:
import sys

from PyQt5.QtWidgets import *


class Window1(QWidget):
    def __init__(self):
        super(Window1, self).__init__()
        QLabel("我是抽屉1要显示的内容",self)
        self.setStyleSheet("background-color:green;")


class Window2(QWidget):
    def __init__(self):
        super(Window2, self).__init__()
        QLabel("我是抽屉2要显示的内容",self)
        self.setStyleSheet("background-color:red;")


class MyWindow(QWidget):
    def __init__(self):
        super(MyWindow, self).__init__()
        self.create_stacked_layout()
        self.initUI()

    def create_stacked_layout(self):
        # 创建抽屉布局
        self.stacked_layout = QStackedLayout()
        # 创建单独的widget
        win1 = Window1()
        win2 = Window2()
        # 将创建的2个widget添加到抽屉布局器中
        self.stacked_layout.addWidget(win1)
        self.stacked_layout.addWidget(win2)

    def initUI(self):
        # 设置widget大小以及固定宽高
        self.setFixedSize(300, 270)

        # 创建整体布局器
        container = QVBoxLayout()

        # 创建一个要显示的具体内容的子widget
        widget = QWidget()
        widget.setLayout(self.stacked_layout)
        widget.setStyleSheet("background-color:gray;")

        # 创建2个按钮,用来点击进行切换布局器中的widget
        btn_press1 = QPushButton("抽屉1")
        btn_press2 = QPushButton("抽屉2")
        # 给按钮添加事件,即点击及进行切换抽屉布局器中的widget
        # 如果按钮被点击连接事件self.btn_press1_clicked
        btn_press1.clicked.connect(self.btn_press1_clicked)
        btn_press2.clicked.connect(self.btn_press2_clicked)

        # 将要显示的控件添加到container布局器中
        container.addWidget(widget)
        container.addWidget(btn_press1)
        container.addWidget(btn_press2)
        # 设置widget显示的内容使用的是container布局器
        self.setLayout(container)

    def btn_press1_clicked(self):
        # 设置抽屉布局器的当前索引值,即可切换显示哪个widget
        self.stacked_layout.setCurrentIndex(0)

    def btn_press2_clicked(self):
        self.stacked_layout.setCurrentIndex(1)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = MyWindow()
    w.show()
    app.exec()

 

5. 窗口

在Qt中,生成窗口有三种方式:

Qwidget,QMainWindow,QDialog

5.1 QWidget

空间和窗口的父类,自由度高(什么东西都没有),没有划分菜单,工具栏,状态栏,主窗口等区域

import sys

from PyQt5.QtWidgets import *


class MyWindow(QWidget):
    def __init__(self):
        super().__init__()  # 一定要调用父类的__init__方法,因为它里面有很多对于UI空间的初始化操作
        self.initUI()

    def initUI(self):
        self.resize(300,300)
        label = QLabel("这是文字",self)
        label.setStyleSheet("font-size:30px;color:red")


if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = MyWindow()
    w.show()
    app.exec()

5.2 QMainWindow

是QWidget的子类,包含菜单栏,工具栏,状态栏,标题栏,中间部分为主窗口区域

# _*_ coding utf-8 _*_
# george
# time: 2024/3/15下午6:43
# name: 窗口.py
# comment:
import sys

from PyQt5.QtWidgets import *


class MyWindow(QMainWindow):
    def __init__(self):
        super().__init__()  # 一定要调用父类的__init__方法,因为它里面有很多对于UI空间的初始化操作
        self.initUI()

    def initUI(self):
        self.resize(300,300)

        label = QLabel("这是文字")
        label.setStyleSheet("font-size:30px;color:red")

        # 调用父类的menuBar,对菜单栏进行操作
        menu = self.menuBar()

        file_menu = menu.addMenu("文件")
        file_menu.addAction("新建")
        file_menu.addAction("打开")
        file_menu.addAction("保存")

        edit_menu = menu.addMenu("编辑")
        edit_menu.addAction("复制")
        edit_menu.addAction("粘贴")
        edit_menu.addAction("剪切")

        # 将内容在中心部分显示
        self.setCentralWidget(label)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = MyWindow()
    w.show()
    app.exec()

5.3 QDialog

对话窗口的基类 ,不作为主窗口只是作为按钮点击时的弹窗

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2024/4/8 21:46
# @Author : George
import sys

from PyQt5.QtWidgets import QDialog, QPushButton, QApplication


class MyDialog(QDialog):
    def __init__(self):
        super().__init__()
        self.UI_init()

    def UI_init(self):
        ok_btn = QPushButton("确定", self)
        ok_btn.setGeometry(50,50,100,30)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = MyDialog()
    w.setWindowTitle("Dialog")
    w.show()
    sys.exit(app.exec_())

奇怪的是窗口上面有?

6.信号与槽

6.1 信号(Signal)

信号其实就是事件(按钮点击,内容改变,窗口关闭)或者是状态(选中或是切换)当程序触发了某种状态或是发生了某种事件,就可发射出来一个信号

6.2 槽(slot)

若想捕获这个信号,并执行相应的逻辑代码,就需要用到槽。槽实际上是一个函数,当信号发射出来之后会执行与之绑定的槽函数。

6.3 将信号与槽连接

为了实现,当点击某个按钮时执行某个逻辑,需要将具体的信号和具体的槽函数绑定到一起。

6.3.1 接收信号 

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2024/4/9 23:04
# @Author : George
import sys

from PyQt5.QtWidgets import QApplication, QWidget, QPushButton


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

    def initUI(self):
        # 重新设置窗口的宽高
        self.resize(500, 300)
        btn = QPushButton('点我点我',self)
        btn.setGeometry(200,200,100,30)
        btn.clicked.connect(self.click_my_btn)

    def click_my_btn(self,mgs):
        #槽函数,点击按钮时就是调用此函数。这里的参数是信号发出时传递的参数
        print("我正在点击按钮",mgs)

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

 6.3.2 自定义信号

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2024/4/9 23:33
# @Author : George
import sys
import time

from PyQt5.QtCore import pyqtSignal
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton


class Window(QWidget):
    # 自定义一个信号,并且只能作为类属性
    my_signal = pyqtSignal(str) # 定义的时候声明传递的参数是字符串

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

    def initUI(self):
        self.resize(300, 200)
        btn = QPushButton('开始检测', self)
        btn.setGeometry(100, 150, 100, 30)
        btn.clicked.connect(self.check)
        # 将自定义信号和槽函数进行绑定
        self.my_signal.connect(self.my_slot)

    def my_slot(self, msg):
        print(msg)

    def check(self):
        for i, ip in enumerate(["192.168.3.%s" % x for x in range(1, 255)]):
            print("模拟===正在%s检测系统漏洞......" % ip)
            if i % 5 == 0:
                # 这里是发射信号,并将参数传递给绑定的槽函数,传递的参数是字符串
                self.my_signal.emit("【发现漏洞】") # 这里就是在调用函数
            time.sleep(0.1)




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

 

7.Qt Designer

windows版本下载链接,使用迅雷会很快

https://build-system.fman.io/static/public/files/Qt%20Designer%20Setup.exe

7.1 Qt Designer的基本使用

整体界面

1)创建窗口 

2)设计界面布局 

 3)预览效果

 4)保存UI文件

按ctrl+s保存UI文件

7.2 python调用ui文件显示界面

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2024/4/11 21:22
# @Author : George
import sys
import os

from PyQt5.QtWidgets import QApplication
from PyQt5 import uic

if __name__ == '__main__':
    app = QApplication(sys.argv)
    # 调用UI设计
    ui = uic.loadUi(os.path.join(os.path.expanduser("~"),'Desktop/mini_ui.ui'))
    # 展示窗口
    ui.show()
    app.exec()

显示结果:

7.3 给控件添加信号与槽 

信号与槽的编辑器,但是并不建议使用因为太受限制,所以一般都是通过Qt Designer设计好了界面之后,自己在代码里面设计信号与槽

 在代码里面调用设计好的控件

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2024/4/11 21:54
# @Author : George
import sys
from pathlib import Path
from PyQt5.QtWidgets import QApplication, QWidget, QTextBrowser
from PyQt5 import uic


class MyWindow(QWidget):
    def __init__(self):
        super().__init__()
        self.init_UI()

    def init_UI(self):
        ui_path = Path.home() / "Desktop/login.ui"
        self.ui = uic.loadUi(ui_path)
        # print(self.ui) # ui文件中最顶层对象 Form
        # print(self.ui.__dict__)  # 获取当前对象的所有属性,并且按照键值对的形式呈现
        # print(self.ui.label)  # 最顶层对象中间嵌套的QLabel
        # print(self.ui.label.text())  # label的文本

        # 正文开始
        self.user_name = self.ui.lineEdit
        self.password = self.ui.lineEdit_2
        login_btn = self.ui.pushButton_3
        forget_btn = self.ui.pushButton_4
        text_browser = self.ui.textBrowser

        # 登录按钮绑定槽函数
        login_btn.clicked.connect(self.login)

    def login(self):
        """实现登录逻辑:注意获取到输入框的内容是在点击按钮时,一开始的输入框是空的"""
        if self.user_name.text() == "admin" and self.password.text() == "123":
            print("Login Successful")
        else:
            print("username or password is wrong")


if __name__ == '__main__':
    app = QApplication(sys.argv)
    win = MyWindow()
    win.ui.show()
    app.exec()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/544033.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

《Kubernetes部署篇:基于Kylin V10+ARM架构CPU使用containerd部署K8S 1.26.15集群(一主多从)》

总结&#xff1a;整理不易&#xff0c;如果对你有帮助&#xff0c;可否点赞关注一下&#xff1f; 更多详细内容请参考&#xff1a;企业级K8s集群运维实战 1、在当前实验环境中安装K8S1.25.14版本&#xff0c;出现了一个问题&#xff0c;就是在pod中访问百度网站&#xff0c;大…

【opencv】示例-stiching_detailed.cpp 使用OpenCV进行图像拼接的整体流程

#include <iostream> // 引入输入输出流库 #include <fstream> // 引入文件流库&#xff0c;用于文件输入输出 #include <string> // 引入字符串库 #include "opencv2/opencv_modules.hpp" // 引入OpenCV模块 #include <opencv2/core/utility.h…

【微信小程序——开发DAY4(黑马程序员课程)】

学习目标 自定义小程序组件自定义组件&#xff08;1.&#xff09;创建自定义组件文件夹&#xff08;2.&#xff09;引用自定义组件&#xff08;3.&#xff09;组件和页面的区别&#xff08;4.&#xff09;自定义组件的隔离性——自定义组件不影响小程序的样式——自定义组件也只…

用通俗易懂的方式讲解:大模型高级 RAG 检索策略之递归检索

节前&#xff0c;我们组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、参加社招和校招面试的同学&#xff0c;针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。 基于大模…

LinkSage:基于 GNN 的 Pinterest理解

目录 一、背景二、动机和介绍三、技术设计3.1 数据3.2 图3.3 特征3.4 型 四、主要创新4.1 多维表示4.2 XSage的兼容性4.3 增量服务 五、离线结果5.1 召回5.2 分数分布5.3 峰度 六、在线结果6.1 面向用户的表面6.2 Ads 七、总结 LinkSage&#xff1a;基于图神经网络的Pinterest…

微服务之LoadBalancer负载均衡服务调用

一、概述 1.1什么是负载均衡 LB&#xff0c;既负载均衡&#xff08;Load Balancer&#xff09;,是高并发、高可用系统必不可少的关键组件&#xff0c;其目标是尽力将网络流量平均分发到多个服务器上&#xff0c;以提高系统整体的响应速度和可用性。 负载均衡的主要作用 高并发…

IDEA阅读Java源码 SimpleDateFormat

IDEA阅读Java源码 SimpleDateFormat 文章目录 IDEA阅读Java源码 SimpleDateFormat一、阅读的代码二、IDEA操作2.1 标记断点2.2 启用Debug2.3 按键区分2.4 强制进入方法2.5 进入指定方法2.6 多方法进入指定方法2.7 进入正确的方法2.8 真正的方法体实现 三、SimpleDateFormat源码…

网络篇08 | 运输层 tcp

网络篇08 | 运输层 tcp 01 简介1&#xff09;运输层的作用2&#xff09;与应用层的关系3&#xff09;两个协议的应用场景4&#xff09;传输的数据单位 02 功能特性1&#xff09;面向连接2&#xff09;停止等待协议3&#xff09;流水线传输协议4&#xff09;滑动窗口机制5&#…

011、Python+fastapi,第一个后台管理项目走向第11步:建立python+fastapi项目,简单测试一下

一、说明 本文章就是记录自己的学习过程&#xff0c;如果有用您可以参考&#xff0c;没用你就略过&#xff0c;没有好与不好之分&#xff0c;今天主要是参考了gitee上的一些项目&#xff0c;一步一步的往后i建立 对于学习来说&#xff0c;如果您有java c等经验&#xff0c;py…

Redis的哨兵机制

引入&#xff1a; 主从复制最大的问题还是在主节点上&#xff0c;主节点挂了&#xff0c;从节点就迷茫了&#xff0c;虽然能够提供读操作&#xff0c;但是从节点不能自动生成主节点&#xff0c;不能替换原有主节点对应的角色&#xff1b;此时&#xff0c;就需要程序员/运维手工…

绿联HDMI延长器40265使用AG7120芯片放大器方案

HDMI延长器和放大器 延长器&#xff1a;主要用于HDMI线的延长&#xff0c;有HDMI对接头方式延长&#xff0c;或HDMI公头加HDMI母头的HDMI线进行延长&#xff0c;或通过网线方式延长&#xff0c;早期为双网线&#xff0c;目前已发展为单网线&#xff0c;需要注意的是&#xff0…

L45 【哈工大_操作系统】操作系统接口 系统调用实现

L4 操作系统接口 本节比较简单&#xff0c;故与第五节课程笔记一起发布。本节主要是研究 上层应用 是怎么穿过边界进入 操作系统。 接口&#xff1a;操作系统提供的重要函数/指令( system call )&#xff0c;用来连接硬件&#xff0c;所以OS接口就是系统调用POSIX&#xff08;…

Res2Net网络

Res2Net网络 摘要Abstract1. Res2Net网络1.1 文献摘要1.2 背景1.3 创新点1.4 网络结构1.5 实验1.5.1 在ImageNet数据集上进行实验1.5.2 在CIFAR数据集上进行实验 2. Res2Net代码实现3. 总结 摘要 Res2Net是一种神经网络架构&#xff0c;旨在改善类似ResNet的网络在计算机视觉任…

vscode开发 vue3+ts 的 uni-app 微信小程序项目

创建uni-app项目&#xff1a; # 创建用ts开发的uni-app npx degit dcloudio/uni-preset-vue#vite-ts 项目名称 # 创建用js开发的uni-app npx degit dcloudio/uni-preset-vue#vite 项目名称VS Code 配置 为什么选择 VS Code &#xff1f; HbuilderX 对 TS 类型支持暂不完善VS…

unity记一下如何播放动画

我使用的版本是2022.3.14fc 展开你的模型树&#xff0c;是会出现这个三角形的东西的 然后在资源面板创建一个animation controller 进去之后&#xff0c;把三角形拖进去&#xff0c;就会出现一个动画&#xff0c;然后点击他 在左侧给他创建这么个状态名字&#xff0c;类型…

AskManyAI:一个GPT、Claude、Gemini、Kimi等顶级AI的决斗场

一直以来很多人问我能不能有个稳定&#xff0c;不折腾的全球AI大模型测试网站&#xff0c;既能够保证真实靠谱&#xff0c;又能够保证稳定、快速&#xff0c;不要老动不动就挂了、出错或者漫长的响应。 直到笔者遇到了AskManyAI&#xff0c;直接就惊艳住了&#xff01; 话不多…

第17天:信息打点-语言框架开发组件FastJsonShiroLog4jSpringBoot等

第十七天 本课意义 1.CMS识别到后期漏洞利用和代码审计 2.开发框架识别到后期漏洞利用和代码审计 3.开发组件识别到后期漏洞利用和代码审计 一、CMS指纹识别-不出网程序识别 1.概念 CMS指纹识别一般能识别到的都是以PHP语言开发的网页为主&#xff0c;其他语言开发的网页识…

springboot-tomcat冲突

maven tomcat版本冲突异常 记录一个错误 在项目启动时报错&#xff1a; java.lang.AbstractMethodError: org.apache.tomcat.websocket.server.WsSessionListener.sessionCreated(Ljavax/servlet/http/HttpSessionEvent;)V 引入Session报错。 原因&#xff1a;Springboot默…

数据仓库—维度建模—维度表设计

维度表 维度表(Dimension Table)是数据仓库中描述业务过程中各种维度信息的表,用于提供上下文和描述性信息,以丰富事实数据的分析 维度表是维度建模的灵魂所在,在维度表设计中碰到的问题(比如维度变化、维度层次、维度一致性、维度整合和拆分等)都会直接关系到维度建模…

基于R语言实现的负二项回归模型【理解与实现】-理解负二项回归模型和泊松回归模型之间的区别

前言 我们可以在R语言中使用MASS包中的glm.nb函数来拟合负二项模型&#xff0c;以及使用glm函数来拟合泊松模型。以下是一个详细的过程&#xff0c;包括模拟数据的生成、模型的拟合、结果的比较和解释。 需要的包 if (!require("MASS")) install.packages("M…