pyqt5的组合式部件制作(四)

news2024/9/20 5:43:51

        对组合式部件的制作又改进了一版,组合式部件的子部件不再需要单独“提升为”,如果在模板文件的提升部件窗口内选择了“全局包含”,那么只需要在模板文件和应用文件中直接复制粘贴即可,部件的应用更为简便。如下图:按住ctrl,直接拖拽即可。

 

主程序

from sys import exit, argv
from PyQt5.QtWidgets import QApplication, QWidget
from PyQt5 import uic

import buttons  # 按钮的内嵌图片资源


# 显示界面的初始化
def form_init(form):  # 显示界面的初始化  (backup)
    sons = form.findChildren(QWidget)  # 儿辈部件

    def find_child(child):  # 查找子部件
        try:
            child.init()  # 初始化部件
        except AttributeError:
            pass
        if not isinstance(child, QWidget):
            for grandson in child.findChilldren(QWidget):
                find_child(grandson)  # 递归查找

    for son in sons:
        find_child(son)


if __name__ == '__main__':
    app = QApplication(argv)
    # 读取 UI 文件并转换为 Python 代码
    ui_file = '../UIS/main.ui'  # 更换为实际的ui文件地址
    form0 = uic.loadUi(ui_file)  # 创建显示界面
    form_init(form0)  # 初始化
    form0.dash_2.init(minValue=5000.0, maxValue=10000.0, step=100.0)
    form0.dash_1._extra1.setText('222')  # dash_1的扩展显示1
    form0.dash_1._extra2.setText('999')  # dash_1的扩展显示2
    form0.verticalSlider_1.valueChanged.connect(lambda x: form0.dash_1.actualValue_signal.emit(float(x)))
    form0.verticalSlider_2.valueChanged.connect(lambda x: form0.dash_2.actualValue_signal.emit(float(x)))
    form0.verticalSlider_3.valueChanged.connect(lambda x: form0.dash_1.presetValue_signal.emit(float(x)))
    form0.verticalSlider_4.valueChanged.connect(lambda x: form0.dash_2.presetValue_signal.emit(float(x)))
    form0.show()
    exit(app.exec_())

选择器 

##########################
#                       多选一的选择器                   #
from PyQt5.QtCore import QTimer
from PyQt5.QtWidgets import QGroupBox, QLabel, QWidget, QDoubleSpinBox, QRadioButton
from PyQt5.Qt import pyqtSignal


class MySelectorBox(QGroupBox):

    def __init__(self, parent=None):
        super().__init__(parent)
        self.start_on = 0  # 初始为on的序号
        self.f_controls = []  # 所有的控制器(前端,用来产生动作)
        self.b_controls = []  # 所有的控制器(后台,用来显示状态)
        self.f_states = []  # 所有的状态指示器(前端)
        self.b_states = []  # 所有的状态指示器(后台)

    def init(self):  # 需要在部件初始化的时候运行一次
        members = self.findChildren(QWidget)  # 查找子部件
        for i, m in enumerate(members):  # 查找子部件
            n = m.objectName().find('control')  # 子部件的名称是‘control’
            if n != -1:
                self.b_controls.append(m)
                continue
            n = m.objectName().find('state')  # 子部件的名称是‘state’
            if n != -1:
                t = f'self.state{m.objectName()[n + 5]}'
                exec(f'{t}  =m')  # 将指示器的变量定义映射到查找到的对应子部件,这里最多可以有10个指示器,如果超过10个,需要修改程序
                exec(f'self.b_states.append({t})')
        self.b_controls.sort(key=lambda child: child.objectName())  # 根据名称排序
        self.b_states.sort(key=lambda child: child.objectName())  # 根据名称排序
        for i, c in enumerate(self.b_controls):
            t = f'self.control{i}'
            exec(f'{t} =Controller(c)')  # 将控制器的变量定义映射到查找到的对应子部件,这里最多可以有10个控制器,如果超过10个,需要修改程序
            exec(f'self.f_controls.append({t})')

        for i, s in enumerate(self.b_states):
            t = f'self.state{i}'
            exec(f'{t} =State_lamp(s)')  # 将控制器的变量定义映射到查找到的对应子部件,这里最多可以有10个控制器,如果超过10个,需要修改程序
            exec(f'self.f_states.append({t})')

        self.connect()  # 信号的连接

    def connect(self):  # 信号的连接
        for i in range(len(self.f_controls)):
            def callback(idx):
                return lambda: self.toggle_states(idx)

            self.f_controls[i].Pressed.connect(callback(i))

    def toggle_states(self, n):  # 切换指示器的显示状态

        for i in range(len(self.f_states)):
            if i == n:
                self.f_states[i].set_color(self.f_states[i].on_color)  # 点亮对应的指示器
            else:
                self.f_states[i].set_color(self.f_states[i].off_color)  # 熄灭对应的指示器


class Controller(QLabel):  # 自定义的Qlabel
    Pressed = pyqtSignal()  # 键按下
    Enter = pyqtSignal()  # 鼠标进入
    Leave = pyqtSignal()  # 鼠标离开
    Release = pyqtSignal()  # 鼠标松开
    Adjust = pyqtSignal(float)  # 微调值的输出

    def __init__(self, label):
        super().__init__(label)
        self.label = label
        self.style_first = None
        self.style_last = None
        self.style_normal = self.label.styleSheet().replace('\n', '')
        self.style_press = self.style_normal  # 常态style
        board_begin = self.style_normal.find('border:')
        board_end = self.style_normal.find(' ', board_begin,)
        if board_begin == -1:
            self.style_enter = self.style_normal + 'border: 2px solid rgba(255, 255, 255, 0);'
        else:
            board = self.style_normal[board_begin:board_end]
            self.style_enter = self.style_normal.replace(board, 'border:1px')
        self.setFixedSize(self.label.width(), self.label.height())  # 获取部件的几何尺寸
        self.connect()   # 信号的连接

    def enterEvent(self, event):  # 重新定义鼠标悬停事件
        self.Enter.emit()

    def leaveEvent(self, event):  # 重新定义鼠标离开事件
        self.Leave.emit()

    def mousePressEvent(self, event):  # 重新定义鼠标按下事件
        self.Pressed.emit()

    def mouseReleaseEvent(self, event):  # 重新定义鼠标抬起事件
        self.Release.emit()

    def connect(self):
        self.Enter.connect(self.enter)
        self.Leave.connect(self.leave)
        self.Pressed.connect(self.pressed)
        self.Release.connect(self.release)

    def enter(self):
        self.label.setStyleSheet(self.style_enter)

    def leave(self):
        self.label.setStyleSheet(self.style_normal)

    def pressed(self):
        self.style_last = self.label.styleSheet()
        self.label.setStyleSheet(self.style_press)

    def release(self):
        self.label.setStyleSheet(self.style_last)


class State_lamp(QLabel):  # 自定义的Qlabel
    def __init__(self, label):
        super().__init__(label)
        self.label = label
        self.rad = None
        # self.blink = False
        # self.style_normal = self.label.styleSheet().replace('\n', '')
        self.setFixedSize(self.label.width(), self.label.height())  # 获取部件的几何尺寸
        self.setStyleSheet(self.label.styleSheet().replace('\n', '') + 'background-color: rgba(255, 255, 255, 0);')    # 前端部件背景透明
        self.style = ''
        self.off_color = ''
        self.on_color = ''
        self.border_color = ''
        self.init()

    def init(self,
             isRound=True,
             off_color='#767676',
             on_color='#039806',
             border_color='#868686'):  # 在部件初始化的时候运行一次
        if isRound:
            self.rad = str(round(self.width() / 2))
        else:
            self.rad = 2
        self.off_color = off_color  # 默认off颜色
        self.on_color = on_color  # 默认on颜色
        self.border_color = border_color  # 默认的边框颜色

    def set_color(self, color):  # 设置自定义的颜色
        self.style = f'border-radius:{self.rad}px;background-color:{color};border:1px solid {self.border_color}; '
        self.label.setStyleSheet(self.style)

    def color_on_bool(self, bool_in):  # 由输入的bool来控制颜色的显示,默认为on:绿色,off:灰色
        if bool_in:
            self.style = f'border-radius:{self.rad}px;background-color:{self.on_color}; border:1px solid {self.border_color};'
        else:
            self.style = f'border-radius: {self.rad}px;background-color:{self.off_color}; border:1px solid {self.border_color};'
        self.label.setStyleSheet(self.style)

仪表盘

##########################
#                            仪表盘                            #
# 注意:标准部件之外的附加的部件名称用字符"_"(下划线)开头

from PyQt5.QtGui import QPixmap, QTransform
from PyQt5.QtWidgets import QLabel, QFrame, QWidget
from PyQt5.QtCore import QTimer, Qt
from PyQt5.Qt import pyqtSignal


class MyDash(QFrame):  # 自定义的仪表盘
    actualValue_signal = pyqtSignal(float)  # 实际值的信号
    presetValue_signal = pyqtSignal(float)  # 预设值的信号

    def __init__(self, parent=None):
        super().__init__(parent)

        # 图片资源  ##########
        self.panel_image = QPixmap("../SOURCE/img/表盘.png")  # 表盘图片
        self.pointer_image = QPixmap("../SOURCE/img/指针.png")  # 指针图片
        self.preset_image = QPixmap("../SOURCE/img/预设.png")  # 预设图片

        # 所有部件  ##########
        # self.presetValue = None  # 预设值
        # self.actualValue = 0.0  # 实际值
        self.actualValue_connected = False  # 实时值是否定义连接
        self.presetValue_connected = False  # 预设值是否定义连接

        self.presetValue_value = None  # 预设值的数值
        self.actualValue_value = None  # 实时值的数值

        self.minValue = None  # 最小值
        self.maxValue = None  # 最大值
        self.step_up = None  # +微调步距
        self.step_down = None  # -微调步距
        self.panel = None  # 表盘
        self.pointer = None  # 指针
        self.preset = None  # 预设值进度条
        self.adjust_up = None  # 微调+按钮
        self.adjust_down = None  # 微调-按钮
        self.label_setting = None  # "设置值“标签
        self.label_actual = None  # "实际值“标签

        self.first_init = True  # 如果不是首次初始化,就只执行一部分

    def init(self
             , minValue=0.0
             , maxValue=100.0
             , step=1.0
             ):
        self.minValue = minValue
        self.maxValue = maxValue

        members = self.findChildren(QWidget)  # 查找子部件
        for i, m in enumerate(members):  # 查找子部件

            if m.objectName().find('setting') != -1:  # 子部件的名称包含‘setting’
                if self.first_init:
                    self.label_setting = SettingLabel(m)
                    self.label_setting.connected = False  # 连接未定义过
                    try:
                        self.presetValue_value = float(m.text())  # 预设值的数值
                    except ValueError:
                        self.presetValue_value = 0.0
                    self.preset_redraw(self.presetValue_value)  # 更新预设值

            elif m.objectName().find('actual') != -1:  # 子部件的名称包含‘actual’
                if self.first_init:
                    self.label_actual = m  # 实际值的显示标签
                    self.label_actual.connected = False
                    try:
                        self.actualValue_value = float(m.text())  # 实时值的数值
                    except ValueError:
                        self.actualValue_value = 0.0
                    self.actual_redraw(self.actualValue_value)  # 更新实时值

            elif m.objectName().find('pointer') != -1:  # 子部件的名称是‘pointer’
                if self.first_init:
                    self.pointer = m
                    self.pointer.setPixmap(self.pointer_image)  # 设置图片
                    self.pointer.setAlignment(Qt.AlignCenter)  # 居中显示
                    self.pointer.connected = False

            elif m.objectName().find('panel') != -1:  # 子部件的名称是‘panel’
                if self.first_init:
                    self.panel = m
                    self.panel.setPixmap(self.panel_image)
                    self.panel.setAlignment(Qt.AlignCenter)
                    self.panel.connected = False

            elif m.objectName().find('preset') != -1:  # 子部件的名称是‘preset’
                if self.first_init:
                    self.preset = m
                    self.preset.setPixmap(self.preset_image)
                    self.preset.setAlignment(Qt.AlignCenter)
                    self.preset.connected = False

            elif m.objectName().find('adjust_up') != -1:  # 子部件的名称包含‘adjust_up’
                if self.step_up != step:  # 如果设置值有变
                    self.step_up = step
                    if self.adjust_up is not None:  # 隐藏掉默认的
                        self.adjust_up.hide()
                    self.adjust_up = MyAdjustButton(m, 'up', step)  # 创建前端的操作部件
                    self.adjust_up.connected = False

            elif m.objectName().find('adjust_down') != -1:  # 子部件的名称包含‘adjust_down’
                if self.step_down != step:
                    self.step_down = step
                    if self.adjust_down is not None:
                        self.adjust_down.hide()
                    self.adjust_down = MyAdjustButton(m, 'down', step)
                    self.adjust_down.connected = False

            else:  # 子部件的名称是其他的自定义内容
                if self.first_init:
                    n = m.objectName().find('_dash')
                    variable_name = m.objectName()[:n]
                    if variable_name.find('_') == 0:
                        exec(f'self.{variable_name}=m')
        self.connect()  # 信号的连接

    def connect(self):
        if not self.adjust_up.connected:  # “+”按钮的连接
            self.adjust_up.Adjust.connect(self.preset_process)  # 如果该连接未被定义过,就执行定义
            self.adjust_up.connected = True  # 所有的部件只执行一次连接

        if not self.adjust_down.connected:  # “-”按钮的连接
            self.adjust_down.Adjust.connect(self.preset_process)
            self.adjust_down.connected = True

        if not self.actualValue_connected:    # 实时值的连接
            self.actualValue_signal.connect(self.actual_redraw)  # 考虑换为valueChanged
            self.actualValue_connected = True

        if not self.presetValue_connected:
            self.presetValue_signal.connect(self.preset_redraw)  # 考虑换为valueChanged
            self.presetValue_connected = True

    def preset_process(self, arg):  # 预设值的处理
        preset = self.presetValue_value + arg  # 中间变量,加上本次的微调值
        if preset >= self.maxValue:
            preset = self.maxValue
        elif preset <= self.minValue:
            preset = self.minValue
        self.presetValue_signal.emit(preset)

    def preset_redraw(self, arg):  # 预设值的刷新
        preset = round(float(arg), 1)  # 中间变量
        if round(self.presetValue_value, 1) != preset or self.first_init:    # 判断是否需要刷新
            self.presetValue_value = preset
            degree = (preset - self.minValue) / (self.maxValue - self.minValue) * 180   # 仪表盘指示部件的偏转角度
            self.preset.setPixmap(self.preset_image.transformed(QTransform().rotate(degree)))   # 刷新画面
            self.label_setting.label.setText(str(preset))     # 刷新数字显示

    def actual_redraw(self, arg):  # 实时值的刷新
        actual = round(float(arg), 1)  # 中间变量
        if round(self.actualValue_value, 1) != actual:
            self.actualValue_value = actual
            degree = (actual - self.minValue) / (self.maxValue - self.minValue) * 180   # 仪表盘指示部件的偏转角度
            self.pointer.setPixmap(self.pointer_image.transformed(QTransform().rotate(degree)))   # 刷新画面
            self.label_actual.setText(str(actual))     # 刷新数字显示


class MyAdjustButton(QLabel):  # 自定义的微调按钮
    Pressed = pyqtSignal()  # 键按下
    Enter = pyqtSignal()  # 鼠标进入
    Leave = pyqtSignal()  # 鼠标离开
    Release = pyqtSignal()  # 鼠标松开
    Adjust = pyqtSignal(float)  # 微调值的输出

    def __init__(self, label, ud, step):
        super().__init__(label)
        self.label = label  # 后端的显示部件
        self.ud = ud  # up or down
        self.step = step  # 微调的步距
        self.n = 0  # 可变步距的计时值
        self.style_first = None
        self.style_last = None
        self.style_press = None
        self.style_normal = None
        self.style_enter = None
        self.timer = QTimer()
        self.timer.setInterval(100)
        self.timer.timeout.connect(self.time_out)
        self.style_normal = self.label.styleSheet().replace('\n', '')  # 去掉样式表中的回车
        board_begin = self.style_normal.find('border:')  # 边框定义的起点
        board_end = self.style_normal.find(';', board_begin, )  # 边框定义的终点
        if board_begin == -1:
            self.style_enter = self.style_normal + 'border: 1px solid rgba(255, 255, 255, 0);'  # 鼠标悬停的样式表
            self.style_clicked = self.style_normal + 'border: 12px #039806);'  # 鼠标点击的样式表
        else:
            board = self.style_normal[board_begin:board_end]  # 样式表中关于边框的定义
            board_color_begin = board.find('solid')  # 边框颜色的定义的起点
            board_color = board[board_color_begin:]  # 边框颜色的定义
            new_enter_board = board.replace(board_color, 'solid #e6e6e6')  # 新的鼠标悬停边框定义
            new_clicked_board = board.replace(board_color, 'solid #039806')  # 新的鼠标按下边框定义
            self.style_enter = self.style_normal.replace(board, new_enter_board)  # 新的鼠标悬停样式表
            self.style_press = self.style_normal.replace(board, new_clicked_board)  # 新的鼠标按下样式表
        self.setFixedSize(self.label.width(), self.label.height())  # 获取部件的几何尺寸
        self.setStyleSheet('background-color: rgba(0, 0, 0, 0);')  # 部件透明,叠加在原有的部件上
        self.connect()  # 信号的连接

    def enterEvent(self, event):  # 重新定义鼠标悬停事件
        self.Enter.emit()

    def leaveEvent(self, event):  # 重新定义鼠标离开事件
        self.Leave.emit()

    def mousePressEvent(self, event):  # 重新定义鼠标按下事件
        self.Pressed.emit()
        self.timer.start()

    def mouseReleaseEvent(self, event):  # 重新定义鼠标抬起事件
        self.timer.stop()
        self.n = 0
        self.Release.emit()

    def time_out(self):  # 定时器超时响应
        self.n += 1  # 计时器递增
        if self.timer.isActive():
            if self.ud == 'up':  # 如果是+
                i = self.step
            else:  # 如果是-
                i = -1.0 * self.step

            if self.n < 20:  # 定时器在2秒内
                self.Adjust.emit(0.1 * i)  # 设定步距的0.1倍
            elif self.n < 50:  # 定时器在5秒内
                self.Adjust.emit(i)  # 设定步距
            else:  # 定时器超过5秒
                self.Adjust.emit(10 * i)  # 设定步距的10倍

    def connect(self):
        self.Enter.connect(self.enter)
        self.Leave.connect(self.leave)
        self.Pressed.connect(self.pressed)
        self.Release.connect(self.release)

    def pressed(self):
        self.style_last = self.label.styleSheet()
        self.label.setStyleSheet(self.style_press)

    def release(self):
        self.label.setStyleSheet(self.style_last)

    def enter(self):
        self.style_first = self.label.styleSheet().replace('\n', '')
        self.style_last = self.style_first
        self.label.setStyleSheet(self.style_enter)

    def leave(self):
        self.label.setStyleSheet(self.style_first)


class SettingLabel(QLabel):  # “设置”标签的定义
    Clicked = pyqtSignal()  # 鼠标点击
    DoubleClicked = pyqtSignal()  # 鼠标双击
    Enter = pyqtSignal()  # 鼠标进入
    Leave = pyqtSignal()  # 鼠标离开
    Release = pyqtSignal()  # 鼠标释放

    def __init__(self, label):
        super().__init__(label)
        self.font = None
        self.label = label
        self.label.setText('')
        self.style_normal = self.label.styleSheet().replace('\n', '')
        board_begin = self.style_normal.find('border:')
        board_end = self.style_normal.find(';', board_begin, )
        if board_begin == -1:
            self.style_enter = self.style_normal + 'border: 1px solid rgba(255, 255, 255, 0);'
            self.style_clicked = self.style_normal + 'border: 12px #039806);'
        else:
            board = self.style_normal[board_begin:board_end]
            board_color_begin = board.find('solid')
            board_color = board[board_color_begin:]
            new_enter_board = board.replace(board_color, 'solid #e6e6e6')
            new_clicked_board = board.replace(board_color, 'solid #039806')  #
            self.style_enter = self.style_normal.replace(board, new_enter_board)
            self.style_clicked = self.style_normal.replace(board, new_clicked_board)

        self.style_last = None
        self.style_first = None

        self.timer = QTimer()

        self.n = 0  # 点击次数
        self.first_click = True  # 首次点击

        self.init()
        self.connect()

    def init(self):
        self.setFixedSize(self.label.width(), self.label.height())  # 获取部件的几何尺寸
        self.setStyleSheet('background-color: rgba(0, 0, 0, 0);')  # 部件透明,叠加在原有的部件上
        self.setFont(self.label.font())  # 设置字体

    def connect(self):
        self.Enter.connect(self.enter)
        self.Clicked.connect(self.clicked)
        self.DoubleClicked.connect(self.doubleClicked)
        self.Release.connect(self.release)
        self.Leave.connect(self.leave)
        self.timer.timeout.connect(self.time_out)

    def mousePressEvent(self, event):
        self.style_last = self.label.styleSheet()
        self.label.setStyleSheet(self.style_clicked)
        if self.first_click:  # 如果是首次点击
            self.timer.start(300)  # 开始计时,如果出现了超时,就计算点击次数
            self.first_click = False
        else:
            self.n += 1

    def time_out(self):
        if self.n == 0:
            self.Clicked.emit()  # 单击
        else:
            self.DoubleClicked.emit()  # 双击

    def mouseReleaseEvent(self, event):  # 重新定义鼠标释放事件mouseReleaseEvent
        self.Release.emit()

    def enterEvent(self, event):  # 重新定义鼠标悬停事件
        # self.style_first = self.label.styleSheet().replace('\n', '')
        self.Enter.emit()

    def leaveEvent(self, event):  # 重新定义鼠标离开事件
        self.label.setStyleSheet(self.style_normal)
        self.Leave.emit()

    def clicked(self):
        if self.timer.isActive():
            self.timer.stop()
            self.first_click = True
            self.n = 0

    def doubleClicked(self):
        if self.timer.isActive():
            self.timer.stop()
            self.first_click = True
            self.n = 0

    def release(self):
        self.label.setStyleSheet(self.style_last)

    def enter(self):
        self.style_first = self.label.styleSheet().replace('\n', '')
        self.style_last = self.style_first
        self.label.setStyleSheet(self.style_enter)

    def leave(self):
        self.label.setStyleSheet(self.style_first)

运行截图:

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

知虾shopee收费,多少钱一个月

在当今电商行业的竞争激烈的环境下&#xff0c;许多商家都在寻求更好的方式来推广和销售他们的产品。这就是为什么越来越多的商家选择使用知虾shopee这样的平台来展示和销售他们的商品。但是&#xff0c;对于许多商家来说&#xff0c;他们可能会对知虾shopee的收费情况感到好奇…

最受欢迎的猫罐头有那些?精选的5款热门猫罐头推荐!

新手养猫很容易陷入疯狂购买的模式&#xff0c;但有些品牌真的不能乱买&#xff01;现在的大环境不太好&#xff0c;我们需要学会控制自己的消费欲望&#xff0c;把钱花在刀刃上&#xff01;现在宠物市场真的很内卷&#xff0c;很多品牌都在比拼产品的数据和营养成分。很多铲屎…

java游戏制作-飞翔的鸟游戏

一.准备工作 首先创建一个新的Java项目命名为“飞翔的鸟”&#xff0c;并在src中创建一个包命名为“com.qiku.bird"&#xff0c;在这个包内分别创建4个类命名为“Bird”、“BirdGame”、“Column”、“Ground”&#xff0c;并向需要的图片素材导入到包内。 二.代码呈现 …

银行业务测试

1、商业银行四大类&#xff1a; 业务类系统、渠道类面试、MIS类系统、其他基础平台系统 2、银行系统开发流程&#xff08;UAT是行方&#xff09; 3、银行系统测试流程 4、对于不同的服务方式也不同&#xff0c;如:柜台、手机银行、网上银行&#xff0c;电话外呼&#xff0c;…

13、深度学习之神经网络

深度学习是机器学习中重要的一个学科分支,它的特点就在于需要构建多层“深度”的神经网络。 人们在探索人工智能初期,就曾设想构建一个用数学方式来表达的模型,它可以模拟人的大脑,大脑我们都知道,有很多神经元,每个神经元之间通过突触链接。 神经网络的设计就是模仿了这…

Android线程优化——整体思路与方法

**在日常开发APP的过程中&#xff0c;难免需要使用第二方库和第三方库来帮助开发者快速实现一些功能&#xff0c;提高开发效率。但是&#xff0c;这些库也可能会给线程带来一定的压力&#xff0c;主要表现在以下几个方面&#xff1a; 线程数量增多&#xff1a;一些库可能会在后…

ROSNS3(一)

https://github.com/malintha/rosns3 第一步&#xff1a;clone和构建rosns3客户端 第二步&#xff1a;运行 最详细的ubuntu 安装 docker教程 - 知乎 1. unable to find source space /home/muta/src 解决方法&#xff1a; 将副将将碰到的bug&#xff0c;解决方法_#include &…

论文阅读 Forecasting at Scale (一)

最近在看时间序列的文章&#xff0c;回顾下经典 论文地址 项目地址 Forecasting at Scale 摘要1、介绍2、时间业务序列的特点3、Prophet预测模型3.1、趋势模型3.1.1、非线性饱和增长3.1.2、具有变化点的线性趋势3.1.3、自动转换点选择3.1.4、趋势预测的不确定性 摘要 预测是一…

海外IP代理:数据中心代理IP是什么?好用吗?

数据中心代理是代理IP中最常见的类型&#xff0c;也被称为机房IP。这些代理服务器为用户分配不属于 ISP&#xff08;互联网服务提供商&#xff09;而来自第三方云服务提供商的 IP 地址。数据中心代理的最大优势——它们允许在访问网络时完全匿名。 如果你正在寻找海外代理IP&am…

python实现鼠标实时坐标监测

python实现鼠标实时坐标监测 一、说明 使用了以下技术和库&#xff1a; tkinter&#xff1a;用于创建GUI界面。pyperclip&#xff1a;用于复制文本到剪贴板。pynput.mouse&#xff1a;用于监听鼠标事件&#xff0c;包括移动和点击。threading&#xff1a;用于创建多线程&…

基本的弹层,点击弹出

<div class"role"><el-button type"primary" size"mini" click"showDialog true">添加角色</el-button></div><!--控制弹框的显示隐藏visible .sync可以点击X关闭弹框 --> <el-dialog width"…

怎么提高拍摄视频画质和清晰度?这几个方法一定要学会

一、提高拍摄视频画质和清晰度 1、分辨率 分辨率就是我们常说的480P、720P、1080P、4K等等&#xff0c;分辨率越大&#xff0c;在某种程度上视频也就越清晰。虽然原理是这样的&#xff0c;但在不同平台上传视频也会影响最终的画质。 比如超高分辨率的视频不适合在某音。因为…

Electronica上海 Samtec 验证演示 | FireFly™Micro Flyover System™

摘要/前言 在圆满结束的2023慕尼黑上海电子展上&#xff0c;Samtec虎家团队为观众带来了前所未有的丰富体验&#xff1a;产品展示、采访、Demo演示、抽奖互动~ 尤其是Demo演示&#xff0c;虎家工程师FAE Marcus为大家带来了数个精彩的产品与系统讲解演示。其中更不乏合作伙伴…

shell 条件语句

目录 测试 test测试文件的表达式 是否成立 格式 选项 比较整数数值 格式 选项 字符串比较 常用的测试操作符 格式 逻辑测试 格式 且 &#xff08;全真才为真&#xff09; 或 &#xff08;一真即为真&#xff09; 常见条件 双中括号 [[ expression ]] 用法 &…

shopee数据分析软件:了解市场趋势,分析竞争对手,优化运营策略

在当今数字化时代&#xff0c;数据已经成为了企业决策的重要依据。对于电商行业来说&#xff0c;数据更是至关重要。如果你想在电商领域中脱颖而出&#xff0c;那么你需要一款强大的数据分析工具来帮助你更好地了解市场、分析竞争对手、优化运营策略。而知虾数据软件就是这样一…

Windows + VS2022超详细点云库(PCL1.8.1)配置

本文在结合多位CSDN大佬的步骤&#xff0c;记录以下最全的点云配置过程&#xff0c;防止走弯路&#xff08;并在最后配上PCL环境配置成功的测试代码-彩色兔子&#xff09; 一、PCL介绍 PCL概述_pcl技术_一杯盐水的博客-CSDN博客 二、准备工作&#xff08;PCL版本的下载&…

Banana Pi BPI-R3 Mini 开源路由器,也能拍出艺术美感

香蕉派BPI-R3 Mini路由器板开发板采用联发科MT7986A(Filogic 830)四核ARM A53芯片设计&#xff0c;板载2G DDR 内存&#xff0c;8G eMMC和128MB SPI NAND存储&#xff0c;是一款非常高性能的开源路由器开发板&#xff0c;支持Wi-Fi6 2.4G/5G&#xff08;MT7976C&#xff09;&am…

网络知识学习(笔记二)

ios模型规定的网络模型一共有7层&#xff0c;但是实际使用过程中&#xff0c;4层的TCP/IP模型是经常使用的&#xff0c;网络知识学习笔记里面也是基于4层TCP/IP模型进行分析的&#xff0c;前面已经讲了&#xff1a;&#xff08;1&#xff09;物理层&#xff0c;&#xff08;2&a…

汇编语言学习笔记

汇编语言的不同种类 as86汇编&#xff1a;能产生16位代码的Intel 8086汇编 mov ax, cs //cs→ax&#xff0c;目标操作数在前GNU as汇编&#xff1a;产生32位代码&#xff0c;使用AT&T系统V语法 movl var&#xff0c; %eax // var→%eax&#xff0c;目标操作数在后内嵌汇编…