Python练习之抽奖界面

前言

一、代码整体架构分析

1、数据层 (Model) 

 2、控制层 (Controller)

3、视图层 (View) 

二、核心功能实现详解 

1、 文件导入功能 

1.1、实现逻辑

 1.2、代码涉及知识点讲解

1.2.1、wildcard

1.2.2、wx.FileDialog 

1.2.3、dlg.ShowModal()

2、抽奖动画控制

1.1、实现逻辑

1.2、代码涉及知识点讲解

1.3、关键技术点详解

1.4、代码示例场景

1.5、关联代码示例

3、抽奖结果处理

三、关键技术点详解

1. wxPython组件体系

2、布局管理系统

3、事件驱动模型 

四、完成代码 

前言

最近在学习Python,写成文章供大家参考,同时也方便自己阅读和熟悉代码。有问题欢迎指正。

一、代码整体架构分析

本程序采用经典的 MVC模式 进行设计,通过wxPython实现GUI界面,主要包含以下模块:

1、数据层 (Model

  • self.participants:存储待抽奖人员列表

  • self.winners:存储已中奖人员列表

  • 文件数据源处理(CSV/TXT)

 2、控制层 (Controller)

  • 定时器控制抽奖动画:wx.Timer

  • 状态管理:is_rolling控制流程

  • 事件驱动:按钮点击、定时器响应

3、视图层 (View

  • 主界面布局:按钮区+显示区+名单区

  • 状态栏反馈

  • 动态颜色变化增强视觉效果

二、核心功能实现详解 

1、 文件导入功能 

1.1、实现逻辑

def on_import(self, event):wildcard = "文本文件 (*.txt)|*.txt|CSV文件 (*.csv)|*.csv"dlg = wx.FileDialog(self, "选择名单文件", wildcard=wildcard,style=wx.FD_OPEN|wx.FD_FILE_MUST_EXIST)if dlg.ShowModal() == wx.ID_CANCEL:returnpath = dlg.GetPath()try:if path.endswith('.csv'):with open(path, 'r', encoding='utf-8-sig') as f:reader = csv.reader(f)self.participants = [row[0].strip() for row in reader if row]else:with open(path, 'r', encoding='utf-8') as f:self.participants = [line.strip() for line in f if line.strip()]self.list_ctrl.Set(self.participants)self.FindWindowByName("开始抽奖").Enable()self.SetStatusText(f"成功导入 {len(self.participants)} 位参与者")except Exception as e:wx.MessageBox(f"文件读取失败: {str(e)}", "错误", wx.OK|wx.ICON_ERROR)

 1.2、代码涉及知识点讲解

1.2.1、wildcard

wildcard = "文本文件 (*.txt)|*.txt|CSV文件 (*.csv)|*.csv" 

在 wxPython 中,wildcard 参数用于定义文件对话框(如 wx.FileDialog)中的文件类型过滤规则,其格式为 描述|通配符,多个过滤规则之间用竖线 | 分隔。你提供的示例 "文本文件 (*.txt)|*.txt|CSV文件 (*.csv)|*.csv" 表示用户可以在文件对话框中选择两种文件类型: 

1、格式解析

wildcard = "描述1|通配符1|描述2|通配符2|..."
  • 描述:显示在文件类型下拉框中的可读文本(如 "文本文件 (*.txt)")。

  • 通配符:实际用于过滤文件扩展名的模式(如 *.txt)。

2、示例说明

wildcard = "文本文件 (*.txt)|*.txt|CSV文件 (*.csv)|*.csv"

 规则1

  • 描述:文本文件 (*.txt)

  • 通配符:*.txt(匹配所有 .txt 文件)

规则2

  • 描述:CSV文件 (*.csv)

  • 通配符:*.csv(匹配所有 .csv 文件)

会在文件对话框中看到如下选项:文件类型过滤示例

import wxclass MyFrame(wx.Frame):def __init__(self):super().__init__(None, title="文件对话框示例")self.InitUI()def InitUI(self):panel = wx.Panel(self)btn = wx.Button(panel, label="打开文件", pos=(10, 10))btn.Bind(wx.EVT_BUTTON, self.OnOpenFile)def OnOpenFile(self, event):# 创建文件对话框并设置 wildcarddialog = wx.FileDialog(self,message="选择文件",defaultDir="",defaultFile="",wildcard="文本文件 (*.txt)|*.txt|CSV文件 (*.csv)|*.csv",style=wx.FD_OPEN | wx.FD_FILE_MUST_EXIST)if dialog.ShowModal() == wx.ID_OK:filepath = dialog.GetPath()print("选择的文件路径:", filepath)dialog.Destroy()if __name__ == "__main__":app = wx.App()frame = MyFrame()frame.Show()app.MainLoop()

运行会弹出如下界面: 

 3、常见用法

  • 添加“所有文件”选项:在末尾追加通配符 *.*

 wildcard = "文本文件 (*.txt)|*.txt|CSV文件 (*.csv)|*.csv|所有文件 (*.*)|*.*"

  • 多扩展名匹配:用分号分隔多个通配符

wildcard = "图片文件 (*.jpg;*.png)|*.jpg;*.png"

  • 默认选中某一类型:将目标类型放在最前面
wildcard = "CSV文件 (*.csv)|*.csv|文本文件 (*.txt)|*.txt"

 4、注意事项

  • 竖线分隔符:确保 描述 和 通配符 成对出现,并用 | 分隔。

  • 通配符格式

    • *.txt 表示匹配当前目录下的 .txt 文件。

    • *.* 表示匹配所有文件。

1.2.2、wx.FileDialog 

在 wxPython 中,wx.FileDialog 是用于创建 文件选择对话框 的类。你提供的代码片段是创建一个“打开文件”对话框,以下是逐层解析:

1、代码含义 

wx.FileDialog(self,                           # 父窗口(通常是当前窗口)"选择名单文件",                  # 对话框标题wildcard=wildcard,              # 文件类型过滤规则(如 "*.txt;*.csv")style=wx.FD_OPEN | wx.FD_FILE_MUST_EXIST  # 对话框行为模式
)

2、参数详解

参数作用
self父窗口(通常是 wx.Frame 或 wx.Panel 实例),用于对话框的依附关系。
"选择名单文件"对话框标题(提示用户操作目的,例如“选择要打开的名单文件”)。
wildcard文件类型过滤规则,格式为 `"描述
style对话框行为标志的组合:
wx.FD_OPEN: 对话框为“打开文件”模式(默认是打开,对应还有 wx.FD_SAVE 保存模式)。
wx.FD_FILE_MUST_EXIST: 用户必须选择已存在的文件(禁止输入不存在的文件名)。

 3、典型使用流程

# 1. 创建对话框
dialog = wx.FileDialog(self, "选择名单文件", wildcard="文本文件 (*.txt)|*.txt", style=wx.FD_OPEN | wx.FD_FILE_MUST_EXIST
)# 2. 显示对话框并等待用户操作
if dialog.ShowModal() == wx.ID_OK:# 3. 用户点击了“确定”,获取文件路径selected_path = dialog.GetPath()print("选择的文件:", selected_path)
else:# 用户点击了“取消”print("操作取消")# 4. 销毁对话框(避免内存泄漏)
dialog.Destroy()
1.2.3、dlg.ShowModal()
  • 显示一个模态对话框(如文件选择对话框、消息框等)。

  • 该方法会阻塞程序,直到用户关闭对话框。

  • 返回值表示用户的操作:

    • wx.ID_OK:用户点击“确定”或类似确认按钮。

    • wx.ID_CANCEL:用户点击“取消”或关闭对话框。

1、典型使用场景

1.1、文件选择对话框

def OnOpenFile(self, event):dlg = wx.FileDialog(self, "选择文件", style=wx.FD_OPEN)# 用户点击取消则直接退出if dlg.ShowModal() == wx.ID_CANCEL:dlg.Destroy()  # 销毁对话框(重要!)return# 用户点击确定后的操作(如读取文件)filepath = dlg.GetPath()dlg.Destroy()self.LoadFile(filepath)

1.2、确认对话框

def OnDelete(self, event):dlg = wx.MessageDialog(self, "确定要删除吗?", "确认", wx.YES_NO | wx.ICON_QUESTION)# 用户点击取消或关闭对话框if dlg.ShowModal() == wx.ID_CANCEL:dlg.Destroy()return# 用户点击确定后的操作self.DeleteItem()dlg.Destroy()

注:其他代码含义,将在完整代码给出

2、抽奖动画控制

1.1、实现逻辑

def on_start(self, event):if not self.participants:wx.MessageBox("参与者列表为空!", "警告", wx.OK|wx.ICON_WARNING)returnself.is_rolling = Trueevent.GetEventObject().Disable()self.FindWindowByName("停止").Enable()self.FindWindowByName("导入名单").Disable()self.timer.Start(50)def update_display(self, event):# 1. 检查抽奖状态和参与者列表有效性if self.is_rolling and self.participants:# 2. 随机选取当前显示的中奖者self.current_roll = random.choice(self.participants)# 3. 更新显示文本self.display.SetLabel(self.current_roll)# 4. 随机改变文字颜色self.display.SetForegroundColour(random.choice([wx.RED, wx.BLUE, wx.GREEN, wx.BLACK]))

1.2、代码涉及知识点讲解

1、if self.is_rolling and self.participants:

  • self.is_rolling:确保抽奖处于进行中状态

  • self.participants:确保参与者列表非空

  • 避免在停止状态或空列表时执行无效操作

2、self.current_roll = random.choice(self.participants)

  • 通过random.choice从参与者列表中随机选取一个名字

  • 实现抽奖动画的"滚动"效果

 3、self.display.SetLabel(self.current_roll)

  • self.display:指向显示文本的控件(如wx.StaticText

  • SetLabel:动态更新显示内容

  • 效果:界面上的名字快速变化模拟抽奖过程

 4、self.display.SetForegroundColour(random.choice([...]))

  • 从预设颜色中随机选择文字颜色

  • 支持颜色列表:红、蓝、绿、黑

  • 效果:增强视觉动态感,使抽奖过程更生动

1.3、关键技术点详解

技术点作用
定时器触发通过wx.Timer周期性调用此方法(如每50ms)实现动画效果
随机选择算法random.choice实现公平随机选择
控件属性动态修改实时修改文本内容和颜色属性
状态同步机制self.is_rolling确保仅在抽奖过程中更新

1.4、代码示例场景

假设:

  • 参与者列表:["张三", "李四", "王五"]

  • 定时器间隔:50ms

  • 颜色变化频率:每次定时器触发都变化

 运行时效果

第1次更新:显示"张三"(红色)
第2次更新:显示"李四"(蓝色)
第3次更新:显示"王五"(绿色)
第4次更新:显示"张三"(黑色)
...
(持续直到用户点击停止)

1.5、关联代码示例

class LotteryFrame(wx.Frame):def __init__(self):self.timer = wx.Timer(self)  # 创建定时器self.Bind(wx.EVT_TIMER, self.update_display)  # 绑定事件def on_start(self, event):self.timer.Start(50)  # 每50ms触发一次

3、抽奖结果处理

def on_stop(self, event):self.timer.Stop()self.is_rolling = Falseif self.current_roll:self.winners.append(self.current_roll)self.participants.remove(self.current_roll)self.winner_list.Append(self.current_roll)self.list_ctrl.Set(self.participants)self.FindWindowByName("开始抽奖").Enable()self.FindWindowByName("停止").Disable()self.FindWindowByName("导入名单").Enable()self.SetStatusText(f"剩余参与者: {len(self.participants)} 人")

数据同步机制

  • 移除非中奖者保持数据一致性

  • ListBox.Append()实时更新中奖名单

  • SetStatusText更新状态栏信息

三、关键技术点详解

1. wxPython组件体系

组件作用重要方法/属性
wx.Frame主窗口容器CreateStatusBar()
wx.Panel次级容器SetSizer()
wx.Button按钮控件Bind()Enable()
wx.ListBox列表显示Set()Append()
wx.StaticText文本显示SetLabel()SetFont()
wx.Timer定时器Start()Stop()

2、布局管理系统

main_sizer = wx.BoxSizer(wx.VERTICAL)
btn_sizer = wx.BoxSizer(wx.HORIZONTAL)
list_sizer = wx.BoxSizer(wx.HORIZONTAL)main_sizer.Add(btn_sizer, 0, wx.ALIGN_CENTER | wx.TOP, 10)
main_sizer.Add(self.display, 1, wx.EXPAND | wx.ALL, 20)
main_sizer.Add(list_panel, 2, wx.EXPAND | wx.ALL, 10)

布局策略

  • 垂直布局(VERTICAL)为主容器

  • 按钮区水平排列(HORIZONTAL)

  • EXPAND标志使组件填充可用空间

  • 比例参数控制区域大小(0:固定大小,1:1份空间,2:2份空间)

3、事件驱动模型 

# 按钮事件绑定
btn_start.Bind(wx.EVT_BUTTON, self.on_start)# 定时器事件绑定
self.Bind(wx.EVT_TIMER, self.update_display)

事件处理流程

用户点击按钮 → 触发EVT_BUTTON → 调用on_start

启动定时器 → 周期触发EVT_TIMER → 调用update_display

用户点击停止 → 终止定时器 → 处理抽奖结果

四、完成代码 

import wx
import csv
import randomclass LotteryFrame(wx.Frame):def __init__(self):super().__init__(None, title="幸运大抽奖", size=(800, 600))self.participants = []self.winners = []self.timer = wx.Timer(self)# 用 is_rolling 属性记录某个过程的状态(如“抽奖是否正在进行中”),方便后续逻辑判断。"""典型应用场景防止重复操作例如:禁用“开始”按钮,直到当前操作完成。动画/进程控制例如:标记一个动画是否正在播放,避免中途打断。资源锁例如:在多线程中标记某个资源是否被占用。"""self.is_rolling = False  # 初始状态:未开始self.current_roll = ""self.init_ui()self.CreateStatusBar()  # 创建状态栏self.Show()def init_ui(self):panel = wx.Panel(self)#  顶部控制按钮btn_open = wx.Button(panel, label="导入名单")btn_start = wx.Button(panel, label="开始抽奖")btn_stop = wx.Button(panel, label="停止")# 绑定btn_open.Bind(wx.EVT_BUTTON, self.on_import)btn_start.Bind(wx.EVT_BUTTON, self.on_start)btn_stop.Bind(wx.EVT_BUTTON, self.on_stop)# 抽奖显示区域self.display = wx.StaticText(panel, label="准备就绪", style=wx.ALIGN_CENTRE)self.display.SetFont(wx.Font(32, wx.FONTFAMILY_DEFAULT,wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_BOLD))# 列表区域list_panel = wx.Panel(panel)self.list_ctrl = wx.ListBox(list_panel, style=wx.LB_SINGLE)  # 单选模式self.winner_list = wx.ListBox(list_panel, style=wx.LB_SINGLE)# 布局main_sizer = wx.BoxSizer(wx.VERTICAL)  # 垂直布局btn_sizer = wx.BoxSizer(wx.HORIZONTAL)  # 水平布局btn_sizer.Add(btn_open, 0, wx.ALL, 5)btn_sizer.Add(btn_start, 0, wx.ALL, 5)btn_sizer.Add(btn_stop, 0, wx.ALL, 5)list_sizer = wx.BoxSizer(wx.HORIZONTAL)list_sizer.Add(wx.StaticText(list_panel, label="参与者列表"), 0, wx.ALL, 5)list_sizer.Add(self.list_ctrl, 1, wx.EXPAND | wx.ALL, 5)list_sizer.Add(wx.StaticText(list_panel, label="中奖名单"), 0, wx.ALL, 5)list_sizer.Add(self.winner_list, 1, wx.EXPAND | wx.ALL, 5)list_panel.SetSizer(list_sizer)main_sizer.Add(btn_sizer, 0, wx.ALIGN_CENTER | wx.TOP, 10)main_sizer.Add(self.display, 1, wx.EXPAND | wx.ALL, 20)main_sizer.Add(list_panel, 2, wx.EXPAND | wx.ALL, 10)panel.SetSizer(main_sizer)# 初始化btn_start.Disable()btn_stop.Disable()self.Bind(wx.EVT_TIMER, self.update_display)# wildcard 参数用于定义文件对话框(如 wx.FileDialog)中的文件类型过滤规则,其格式为 描述|通配符,# 多个过滤规则之间用竖线 | 分隔# wildcard = "描述1|通配符1|描述2|通配符2|..."# 描述:显示在文件类型下拉框中的可读文本(如 "文本文件 (*.txt)")。# 通配符:实际用于过滤文件扩展名的模式(如 *.txt)。# 添加“所有文件”选项:wildcard = "文本文件 (*.txt)|*.txt|CSV文件 (*.csv)|*.csv|所有文件 (*.*)|*.*"def on_import(self, event):# 规则1:文本文件 (*.txt)、*.txt(匹配所有 .txt 文件)# 规则2:CSV文件 (*.csv)、*.csv(匹配所有 .csv 文件)wildcard = "文本文件 (*.txt)|*.txt|CSV文件 (*.csv)|*.csv"# wx.FileDialog 是用于创建 文件选择对话框 的类# wx.FD_FILE_MUST_EXIST:用户必须选择已存在的文件(禁止输入不存在的文件名)# wx.FD_OPEN: 对话框为“打开文件”模式(默认是打开,对应还有 wx.FD_SAVE 保存模式)dlg = wx.FileDialog(self, "选择名单文件",wildcard=wildcard,  # 文件类型过滤规则(如 "*.txt;*.csv")style=wx.FD_OPEN | wx.FD_FILE_MUST_EXIST)# dlg.ShowModal() 显示模态对话框,并等待用户操作# 该方法会返回一个整数(如 wx.ID_OK 或 wx.ID_CANCEL),表示用户的操作结果(例如点击了“确定”还是“取消”按钮)# wx.ID_OK:用户点击“确定”或类似确认按钮。# wx.ID_CANCEL:用户点击“取消”或关闭对话框。if dlg.ShowModal() == wx.ID_CANCEL:return# 获取用户选择的文件路径path = dlg.GetPath()try:if path.endswith('.csv'):# 安全打开并读取文件# 使用上下文管理器打开文件,确保文件操作结束后自动关闭文件(避免资源泄漏)。即使代码块中发生异常,文件也会正确关闭。# path:要打开的文件的路径(字符串类型)。# 'r':以只读模式打开文件(默认模式)。# 'w':写入模式(覆盖原有内容)。# 'a':追加模式(在文件末尾添加内容)。# 'r+':读写模式。# encoding='utf-8-sig':UTF-8 with BOM。读取时:自动识别并去除 BOM。写入时:自动添加 BOM。# 对比普通 UTF-8:普通 utf-8 编码不会处理 BOM,若文件包含 BOM,直接读取时会显示为开头的 \ufeff 字符。with open(path, 'r', encoding='utf-8-sig') as f:# 创建CSV文件读取器,使用 Python 的 csv 模块创建一个 CSV 读取器对象(reader)# ,用于逐行解析 CSV 文件内容。# 每行文本会被自动拆分为列表(例如 "Alice,30" → ["Alice", "30"])。reader = csv.reader(f)# for row in reader:遍历 CSV 文件中的每一行,每行 row 是一个列表(例如 ["张三", "男", "30"])。# if row:过滤空行(跳过内容为空的无效行)# row[0].strip() row[0]:取每行的第一个字段(索引为0的列).strip():去除该字段首尾的空白字符(如空格、换行符等),确保数据干净。# 将所有行的第一个字段(处理后)存入 self.participants 列表(例如 ["张三", "李四", ...])。self.participants = [row[0].strip() for row in reader if row]  # 提取首列数据并处理else:with open(path, 'r', encoding='utf-8') as f:self.participants = [line.strip() for line in f ifline.strip()]  # if line.strip() 跳过空行(防止将空字符串或纯空白行加入列表)self.list_ctrl.Set(self.participants)  # 将 self.participants(通常是一个字符串列表)中的条目显示到列表控件中。# 通过名称查找界面中名为“开始抽奖”的控件,并启用该控件(使其可交互)# self.FindWindowByName("开始抽奖"):在窗口或容器中查找名为 "开始抽奖" 的控件(如按钮、文本框等)# .Enable():启用控件,使其可以响应用户操作(如点击按钮、输入文本等)# Enable(True) 或 Enable():启用控件。Enable(False):禁用控件(灰色不可用状态)。# FindWindowByName() 可以查找任意类型的控件(按钮、文本框、列表等),只要其名称匹配。self.FindWindowByName("开始抽奖").Enable()self.SetStatusText(f"成功导入 {len(self.participants)} 位参与者")except Exception as e:wx.MessageBox(f"文件读取失败: {str(e)}", "错误",wx.OK | wx.ICON_ERROR)  # 弹出一个错误提示对话框# 组合标志,表示弹窗包含“确定”按钮和错误图标。# 错误信息动态化:{str(e)} 会将捕获的异常(如 FileNotFoundError)转换为字符串,显示具体错误原因(例如 文件未找到: 'data.txt')# wx.OK:弹窗显示“确定”按钮。# wx.ICON_ERROR:显示红色错误图标(⚠️ 或 ❌,依操作系统而定)。def on_start(self, event):if not self.participants:  # 检查参与者列表是否为空wx.MessageBox("参与者列表为空!", "警告", wx.OK | wx.ICON_WARNING)returnself.is_rolling = True# event.GetEventObject():获取触发当前事件的控件对象(例如按钮、菜单项等)。触发事件的控件实例(如 wx.Button、wx.TextCtrl 等)。event.GetEventObject().Disable()  # 禁用当前按钮("开始抽奖"按钮)self.FindWindowByName("停止").Enable()  # 启用"停止"按钮self.FindWindowByName("导入名单").Disable()  # 禁用"导入名单"按钮self.timer.Start(50)  # 定时器(间隔50ms)快速滚动动画def update_display(self, event):if self.is_rolling and self.participants:self.current_roll = random.choice(self.participants)self.display.SetLabel(self.current_roll)self.display.SetForegroundColour(random.choice([wx.RED, wx.BLUE, wx.GREEN, wx.BLACK]))def on_stop(self, event):self.timer.Stop()self.is_rolling = Falseif self.current_roll:self.winners.append(self.current_roll)self.participants.remove(self.current_roll)self.winner_list.Append(self.current_roll)self.list_ctrl.Set(self.participants)self.FindWindowByName("开始抽奖").Enable()self.FindWindowByName("停止").Disable()self.FindWindowByName("导入名单").Enable()self.SetStatusText(f"剩余参与者: {len(self.participants)} 人")if __name__ == "__main__":app = wx.App()frame = LotteryFrame()app.MainLoop()

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

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

相关文章

【云原生】docker 搭建单机PostgreSQL操作详解

目录 一、前言 二、前置准备 2.1 服务器环境 2.2 docker环境 三、docker安装PostgreSQL过程 3.1 获取PostgreSQL镜像 3.2 启动容器 3.2.1 创建数据卷目录 3.2.2 启动pg容器 3.3 客户端测试连接数据库 四、创建数据库与授权 4.1 进入PG容器 4.2 PG常用操作命令 4.2…

算法为舟 思想为楫:AI时代,创作何为?

在科技浪潮汹涌澎湃的当下,AI技术以前所未有的态势席卷各个领域,创作领域亦未能幸免。当生成式AI展现出在剧本撰写、诗歌创作、图像设计等方面的惊人能力时,人类创作者仿佛置身于文明演化的十字路口,迷茫与困惑交织,兴奋与担忧并存。在AI时代,创作究竟该何去何从?这不仅…

JAVA的内存图理解

目录 一、方法区1、类常量池2、静态常量池3、方法区过程 二、栈三、堆1、字符常量池2、堆内存图的绘制 java中内存可以分为 方法区、 堆、 栈、 程序计数器、 本地方法栈,其中比较中重要的是方法区、堆、栈。 一、方法区 1.方法区(Method Area&…

基于Selenium的IEEE Xplore论文数据爬取实战指南

基于Selenium的IEEE Xplore论文数据爬取实战指南 一、项目背景与目标 IEEE Xplore作为全球知名的学术资源平台,收录了大量高质量科技文献。本教程将演示如何通过Python的Selenium库实现: 自动化获取指定领域论文列表(以"构音障碍"为例)完整提取论文标题、摘要、…

软件工程面试题(十二)

1、文件和目录(i/o)操作,怎么列出某目录下所有文件?某目录下所有子目录,怎么判断文件或目录是否存在?如何读写文件? 列出某目录下所有文件:调用listFile(),然后判断每个File对象是否是文件可以调用 isFile(),判断是否是文件夹可以调用isDirectory(),判断文件或目…

医疗CMS高效管理:简化更新维护流程

内容概要 医疗行业内容管理系统(CMS)的核心价值在于应对医疗信息管理的多维复杂性。面对诊疗指南的动态更新、科研数据的快速迭代以及多机构协作需求,传统管理模式往往面临效率瓶颈与合规风险。现代化医疗CMS通过构建结构化权限管理矩阵&…

谈谈Minor GC、Major GC和Full GC

目录 一、背景 二、三者之间的区分 1、Minor GC 2、Major GC (1)老年代空间不足: (2)晋升(Promotion)失败: (3)空间分配担保失败: &#x…

C盘清理技巧分享:PE Dism++ 空间清理篇

C盘清理技巧分享:PE & Dism 空间清理篇 C盘空间不足是许多用户面临的常见问题,尤其是在使用 Windows 系统时。本文将重点介绍如何使用 PE(Preinstallation Environment)和 Dism 工具高效清理 C盘空间,释放宝贵的存…

低功耗LPWAN模块开发指南:远距离无线通信与边缘计算融合实战‌

在远程资产追踪、野外环境监测等场景中,稳定可靠的长距离通信与超低功耗是系统设计的核心挑战。eFish-SBC-RK3576通过 ‌原生双UART接口 USB OTG扩展能力‌ ,可无缝集成主流LPWAN模组(LoRa/NB-IoT),实现“数据采集-边…

迅为iTOP-RK3576人工智能开发板Android 系统接口功能测试

2.1 开机启动 开发板接通电源,并按下电源开关,系统即启动,在启动过程中,系统会显示下图中的开机画面,它们分别是 Android 系统启动时的 Logo 画面: 最后会显示如下解锁画面: 2.2 命令终端 将…

RAG基建之PDF解析的“无OCR”魔法之旅

PDF文件转换成其他格式常常是个大难题,大量的信息被锁在PDF里,AI应用无法直接访问。如果能把PDF文件或其对应的图像转换成结构化或半结构化的机器可读格式,那就能大大缓解这个问题,同时也能显著增强人工智能应用的知识库。 嘿,各位AI探险家们!今天我们将踏上了一段奇妙的…

二层框架组合实验

实验要求: 1,内网IP地址使用172.16.0.0/16分配 2,SW1和sw2之间互为备份 3,VRRP/STP/VLAN/Eth-trunk均使用 4,所有PC均通过DHCP获取IP地址 5,ISP只能配置IP地址 6,所有电脑可以正常访问ISP路由器环回 实验思路顺序: 创建vlan eth-trunk 划分v…

光纤耦合器

以下是关于光纤耦合器的详细介绍: 定义与原理 - 定义:光纤耦合器是一种能使传输中的光信号在特殊结构的耦合区发生耦合,并进行再分配的器件,也叫分歧器、连接器、适配器、光纤法兰盘。 - 原理:利用不同光纤面紧邻光纤芯…

惠普(HP)和联想(Lenovo)作为全球两大电脑品牌,并不是简单的“拼接电脑”

惠普(HP)和联想(Lenovo)作为全球两大电脑品牌,并不是简单的“拼接电脑”,它们都有自己的核心技术、专利设计和生态体系。以下是它们“自己的”核心部分: 1. 关键自研技术 品牌自研技术/专利说明…

若依赖前端处理后端返回的错误状态码

【背景】 后端新增加了一个过滤器,用来处理前端请求中的session 若依赖存放过滤器的目录:RuoYi-Vue\ruoyi-framework\src\main\java\com\ruoyi\framework\security\filter\ 【问题】 后端返回了一个状态码为403的错误,现在前端需要处理这…

智能的数学公式:Intelligence = Priori knowledge * Reasoning ?

爱因斯坦的相对论公式大道至简, 假如智能有公式的话,会不会是: 其中,两个影响因子分别是先验知识 和 推理能力,推理能力的指数部分可以是整数也是小数,但是暂时还不好确定。 解析:&#xff08…

简单使用LlamaIndex实现RAG

简单使用LlamaIndex实现RAG 1 介绍 LlamaIndex是一个专门为大语言模型(LLM)设计的开源数据管理工具,旨在简化和优化LLM在外部数据源中的查询过程。适合在数据索引上构建RAG。 参考的地址 # 官网地址 https://docs.llamaindex.ai/en/stabl…

Redis延时队列在订单超时未报到场景的应用补充说明

一、工具类设计要点解析 连接保活机制 Scheduled(cron "0 */10 * * * ?") 定时任务每10分钟向所有队列发送心跳消息("keepAlive"),避免云Redis因空闲断开连接。这是针对云服务商自动回收空闲连接的通用解决方案1。 泛…

理解Kubernetes中CoreDNS域名解析与DNS策略

CoreDNS是什么 CoreDNS是一个灵活可扩展的DNS服务器,使用Go语言编写,旨在提供快速、灵活的DNS服务 为什么需要CoreDNS CoreDNS为Kubernetes集群内部的DNS解析提供服务,使得服务之间能够通过域名互相通信 Kubernetes集群中, CoreDNS是运行在…

日报日报流量分析

快捷键 CtrlK,选择需要抓包的网卡 CtrlF可以进行关键字搜索 CtrlM,标记数据包 CtrlShiftN跳到标记处 查看包有多少协议Protocol Hierarchy(协议分级) 搜了一下TCP协议,是互联网最基本的协议&#xff0…