用python做一个简单的画板
一,画板的介绍
画板(Paint Board)是一个提供用户绘图、涂鸦和创作的平台。现代数字画板通常是由软件程序实现的,具有多种功能。以下是画板的一些主要特征和功能:
1. 基本绘图工具
- 画笔和铅笔:用户可以选择不同的笔刷或笔触类型,调整粗细和透明度来进行绘图。
- 橡皮擦:用于删除不需要的部分。
2. 颜色选择
- 颜色调色板:提供多种颜色供用户选择,用户还可以自定义颜色。
- 渐变和填充:一些画板支持渐变效果和区域填充,让绘图更为丰富。
3. 形状工具
- 用户可以绘制几何图形,如矩形、圆形、线条和多边形等。
4. 图层管理
- 支持图层的概念,允许用户在不同的层上绘图,便于编辑和修改,不同图层之间相互独立。
5. 撤销和重做
- 提供撤销和重做功能,让用户可以轻松修正错误,支持多步撤销。
6. 区域选择和填充
- 一些画板允许用户选择特定区域进行删除或填充颜色,增加创作灵活性。
7. 导入和导出
- 用户可以导入图片进行编辑,也能把创作的作品导出为多种格式(如PNG、JPEG等)。
8. 界面友好
- 设计简洁直观,适合各年龄段用户,提供易于使用的工具和菜单。
9. 额外功能
- 一些高级画板软件还有滤镜、效果、文本工具和图形编辑功能。
10. 可用于多种平台
- 画板可以按需在桌面(Windows、macOS)、在线(浏览器应用)、手机(iOS、Android)等多种平台上使用。
应用场景
- 艺术创作:帮助艺术家进行草图、插画和数字绘画。
- 设计:用于界面设计、图标设计和做原型。
- 教育:教师和学生使用画板进行图形化表达和创作。
- 娱乐:简单的涂鸦游戏或创作活动。
总结
现代画板提供了丰富的功能,能够满足不同用户的创作需求,从简单的涂鸦到复杂的艺术作品,都是一个很好的创作工具。无论是专业艺术家还是业余爱好者,都可以在画板中找到乐趣和表达的可能性。
二,第一步实现画板
我们可以使用 Python 的 Tkinter 库来创建一个简单的画板应用程序。下面的示例代码展示了如何构建一个基本的画板,用户可以通过鼠标在画布上绘画。
import tkinter as tk class PaintApp: def __init__(self, root): self.root = root self.root.title("简单画板") # 创建画布 self.canvas = tk.Canvas(root, bg="white", width=800, height=600) self.canvas.pack() # 初始化绘图相关的变量 self.last_x = None self.last_y = None # 绑定鼠标事件 self.canvas.bind("<Motion>", self.paint) self.canvas.bind("<Button-1>", self.set_last_pos) self.canvas.bind("<ButtonRelease-1>", self.reset) def set_last_pos(self, event): # 设置最后的坐标 self.last_x = event.x self.last_y = event.y def paint(self, event): # 在画布上绘制线条 if self.last_x and self.last_y: x, y = event.x, event.y self.canvas.create_line(self.last_x, self.last_y, x, y, fill="black", width=2) self.last_x = x self.last_y = y def reset(self, event): # 重置最后的坐标 self.last_x = None self.last_y = None if __name__ == "__main__": root = tk.Tk() app = PaintApp(root) root.mainloop()
运行结果:
代码解释
- 创建主窗口:使用
tk.Tk()
创建主窗口,并设置标题。 - 创建画布:使用
tk.Canvas
创建一个白色背景的画布,设置宽度和高度。 - 绘图逻辑:
- 通过绑定
<Motion>
事件,跟踪鼠标移动,并在画布上绘制线条。 - 使用
set_last_pos
方法记录鼠标按下的位置,reset
方法在鼠标释放时重置位置。 - 当鼠标移动时,
paint
方法绘制线条。
- 通过绑定
- 启动应用:在主程序中创建 Tkinter 主循环。
三,优化画板
接下来是一个更完整的 Tkinter 画板代码,包含删除(清空画布)、撤销(恢复上一步操作)、橡皮擦(擦除绘图)和涂颜色的功能。
import tkinter as tk
from tkinter import colorchooser class PaintApp: def __init__(self, root): self.root = root self.root.title("功能完善的画板") # 创建画布 self.canvas = tk.Canvas(root, bg="white", width=800, height=600) self.canvas.pack() # 初始化绘图相关的变量 self.last_x = None self.last_y = None self.color = "black" self.stroke_width = 2 self.lines = [] # 绑定鼠标事件 self.canvas.bind("<Motion>", self.paint) self.canvas.bind("<Button-1>", self.set_last_pos) self.canvas.bind("<ButtonRelease-1>", self.reset) # 创建工具栏 self.toolbar = tk.Frame(root) self.toolbar.pack(fill=tk.X) # 选择颜色按钮 self.color_button = tk.Button(self.toolbar, text="选择颜色", command=self.choose_color) self.color_button.pack(side=tk.LEFT) # 橡皮擦按钮 self.eraser_button = tk.Button(self.toolbar, text="橡皮擦", command=self.use_eraser) self.eraser_button.pack(side=tk.LEFT) # 撤销按钮 self.undo_button = tk.Button(self.toolbar, text="撤销", command=self.undo) self.undo_button.pack(side=tk.LEFT) # 清空画布按钮 self.clear_button = tk.Button(self.toolbar, text="清空画布", command=self.clear_canvas) self.clear_button.pack(side=tk.LEFT) def set_last_pos(self, event): # 设置最后的坐标 self.last_x = event.x self.last_y = event.y def paint(self, event): # 在画布上绘制线条 if self.last_x and self.last_y: x, y = event.x, event.y line = self.canvas.create_line(self.last_x, self.last_y, x, y, fill=self.color, width=self.stroke_width) self.lines.append(line) self.last_x = x self.last_y = y def reset(self, event): # 重置最后的坐标 self.last_x = None self.last_y = None def choose_color(self): # 选择颜色的函数 color = colorchooser.askcolor()[1] if color: self.color = color def use_eraser(self): # 切换到橡皮擦模式 self.color = "white" def undo(self): # 撤销最后一步操作 if self.lines: line = self.lines.pop() self.canvas.delete(line) def clear_canvas(self): # 清空画布 self.canvas.delete("all") self.lines.clear() if __name__ == "__main__": root = tk.Tk() app = PaintApp(root) root.mainloop()
功能解释
- 选择颜色:使用
colorchooser
让用户选择颜色,创建一个新的颜色变量来存储所选颜色。 - 橡皮擦:将当前绘图颜色设置为白色,以模拟橡皮擦的效果。
- 撤销:通过
self.lines
列表保存每一条线,撤销时从列表中删除最后一条线。 - 清空画布:使用
self.canvas.delete("all")
清空画布,并清空存储的线条列表。
四,添加选择区域的功能
下面是更新后的画板应用程序,这个版本添加了选择区域的功能,使用户可以选择区域并对其进行涂色或删除操作。工具栏也已经移动到窗口的顶部。
import tkinter as tk
from tkinter import colorchooser class PaintApp: def __init__(self, root): self.root = root self.root.title("功能完善的画板") # 创建画布 self.canvas = tk.Canvas(root, bg="white", width=800, height=600) self.canvas.pack() # 初始化绘图相关的变量 self.last_x = None self.last_y = None self.color = "black" self.stroke_width = 2 self.lines = [] self.rect_id = None self.start_x = None self.start_y = None # 绑定鼠标事件 self.canvas.bind("<Motion>", self.paint) self.canvas.bind("<Button-1>", self.set_last_pos) self.canvas.bind("<ButtonRelease-1>", self.reset) self.canvas.bind("<Button-3>", self.start_select) # 右键开始选择区域 self.canvas.bind("<B3-Motion>", self.draw_rectangle) # 右键拖动选择区域 self.canvas.bind("<ButtonRelease-3>", self.end_select) # 右键释放结束选择 # 创建工具栏 self.toolbar = tk.Frame(root) self.toolbar.pack(fill=tk.X) # 选择颜色按钮 self.color_button = tk.Button(self.toolbar, text="选择颜色", command=self.choose_color) self.color_button.pack(side=tk.LEFT) # 橡皮擦按钮 self.eraser_button = tk.Button(self.toolbar, text="橡皮擦", command=self.use_eraser) self.eraser_button.pack(side=tk.LEFT) # 撤销按钮 self.undo_button = tk.Button(self.toolbar, text="撤销", command=self.undo) self.undo_button.pack(side=tk.LEFT) # 清空画布按钮 self.clear_button = tk.Button(self.toolbar, text="清空画布", command=self.clear_canvas) self.clear_button.pack(side=tk.LEFT) # 区域删除按钮 self.delete_area_button = tk.Button(self.toolbar, text="区域删除", command=self.delete_selected_area) self.delete_area_button.pack(side=tk.LEFT) # 区域填充按钮 self.fill_area_button = tk.Button(self.toolbar, text="区域填充", command=self.fill_selected_area) self.fill_area_button.pack(side=tk.LEFT) def set_last_pos(self, event): # 设置最后的坐标 self.last_x = event.x self.last_y = event.y def paint(self, event): # 在画布上绘制线条 if self.last_x and self.last_y: x, y = event.x, event.y line = self.canvas.create_line(self.last_x, self.last_y, x, y, fill=self.color, width=self.stroke_width) self.lines.append(line) self.last_x = x self.last_y = y def reset(self, event): # 重置最后的坐标 self.last_x = None self.last_y = None def choose_color(self): # 选择颜色的函数 color = colorchooser.askcolor()[1] if color: self.color = color def use_eraser(self): # 切换到橡皮擦模式 self.color = "white" def undo(self): # 撤销最后一步操作 if self.lines: line = self.lines.pop() self.canvas.delete(line) def clear_canvas(self): # 清空画布 self.canvas.delete("all") self.lines.clear() def start_select(self, event): # 开始选择区域 self.start_x = event.x self.start_y = event.y self.rect_id = self.canvas.create_rectangle(self.start_x, self.start_y, self.start_x, self.start_y, outline='blue', dash=(2, 2)) def draw_rectangle(self, event): # 绘制选择区域 self.canvas.coords(self.rect_id, self.start_x, self.start_y, event.x, event.y) def end_select(self, event): # 结束选择区域 pass def delete_selected_area(self): # 删除选择区域内的内容 if self.rect_id: x1, y1, x2, y2 = self.canvas.coords(self.rect_id) self.canvas.delete(self.rect_id) self.rect_id = None self.clear_area(x1, y1, x2, y2) def clear_area(self, x1, y1, x2, y2): # 清除选择区域内的内容 overlapping_items = self.canvas.find_overlapping(x1, y1, x2, y2) for item in overlapping_items: self.canvas.delete(item) def fill_selected_area(self): # 在选择区域内涂色 if self.rect_id: x1, y1, x2, y2 = self.canvas.coords(self.rect_id) self.canvas.delete(self.rect_id) self.rect_id = None self.canvas.create_rectangle(x1, y1, x2, y2, fill=self.color, outline='') if __name__ == "__main__": root = tk.Tk() app = PaintApp(root) root.mainloop()
功能说明
- 选择区域:用户可以使用鼠标的右键点击并拖动来选择一个矩形区域,该区域用虚线框表示。
- 区域删除:点击“区域删除”按钮后,将删除所选区域内的所有绘制内容。
- 区域填充:点击“区域填充”按钮后,将用当前选择的颜色填充所选区域。
- 工具栏:包含颜色选择、橡皮擦、撤销、清空画布、区域删除和区域填充等功能。
五,最完整的画板
完整版可以把页面保存下来,还可以打开图片,可以各种画图
import tkinter as tk
from tkinter import colorchooser, filedialog
from PIL import Image, ImageDraw, ImageTk class PaintApp: def __init__(self, root): self.root = root self.root.title("绘图应用") self.canvas = tk.Canvas(root, bg="white", width=800, height=600) self.canvas.pack(expand=tk.YES, fill=tk.BOTH) self.toolbar = tk.Frame(root) self.toolbar.pack(side=tk.TOP, fill=tk.X) self.color = "black" self.stroke_width = 2 self.lines = [] self.last_x = None self.last_y = None self.rect_id = None self.image = Image.new("RGB", (800, 600), "white") self.draw = ImageDraw.Draw(self.image) # 工具栏按钮 self.color_button = tk.Button(self.toolbar, text="选择颜色", command=self.choose_color) self.color_button.pack(side=tk.LEFT) self.eraser_button = tk.Button(self.toolbar, text="橡皮擦", command=self.use_eraser) self.eraser_button.pack(side=tk.LEFT) self.undo_button = tk.Button(self.toolbar, text="撤销", command=self.undo) self.undo_button.pack(side=tk.LEFT) self.clear_button = tk.Button(self.toolbar, text="清空", command=self.clear_canvas) self.clear_button.pack(side=tk.LEFT) self.delete_area_button = tk.Button(self.toolbar, text="区域删除", command=self.delete_selected_area) self.delete_area_button.pack(side=tk.LEFT) self.fill_area_button = tk.Button(self.toolbar, text="区域填充", command=self.fill_selected_area) self.fill_area_button.pack(side=tk.LEFT) self.save_button = tk.Button(self.toolbar, text="保存", command=self.save_image) self.save_button.pack(side=tk.LEFT) self.new_button = tk.Button(self.toolbar, text="新建", command=self.new_canvas) self.new_button.pack(side=tk.LEFT) self.open_button = tk.Button(self.toolbar, text="打开", command=self.open_image) self.open_button.pack(side=tk.LEFT) # 事件绑定 self.canvas.bind("<Button-1>", self.set_last_pos) self.canvas.bind("<B1-Motion>", self.paint) self.canvas.bind("<ButtonRelease-1>", self.reset) self.canvas.bind("<Button-3>", self.start_select) self.canvas.bind("<B3-Motion>", self.draw_rectangle) self.canvas.bind("<ButtonRelease-3>", self.end_select) self.start_x = self.start_y = None def set_last_pos(self, event): self.last_x = event.x self.last_y = event.y def paint(self, event): if self.last_x is not None and self.last_y is not None: x, y = event.x, event.y line = self.canvas.create_line(self.last_x, self.last_y, x, y, fill=self.color, width=self.stroke_width) self.lines.append(line) self.draw.line((self.last_x, self.last_y, x, y), fill=self.color, width=self.stroke_width) self.last_x = x self.last_y = y def reset(self, event): self.last_x = None self.last_y = None def choose_color(self): color = colorchooser.askcolor()[1] if color: self.color = color def use_eraser(self): self.color = "white" def undo(self): if self.lines: line = self.lines.pop() self.canvas.delete(line) def clear_canvas(self): self.canvas.delete("all") self.lines.clear() self.image = Image.new("RGB", (800, 600), "white") self.draw = ImageDraw.Draw(self.image) def start_select(self, event): self.start_x = event.x self.start_y = event.y if self.rect_id is not None: self.canvas.delete(self.rect_id) self.rect_id = self.canvas.create_rectangle(self.start_x, self.start_y, self.start_x, self.start_y, outline='blue', dash=(2, 2)) def draw_rectangle(self, event): self.canvas.coords(self.rect_id, self.start_x, self.start_y, event.x, event.y) def end_select(self, event): pass def delete_selected_area(self): if self.rect_id: x1, y1, x2, y2 = self.canvas.coords(self.rect_id) self.canvas.delete(self.rect_id) self.rect_id = None self.clear_area(x1, y1, x2, y2) def clear_area(self, x1, y1, x2, y2): overlapping_items = self.canvas.find_overlapping(x1, y1, x2, y2) for item in overlapping_items: self.canvas.delete(item) def fill_selected_area(self): if self.rect_id: x1, y1, x2, y2 = self.canvas.coords(self.rect_id) self.canvas.delete(self.rect_id) self.rect_id = None self.canvas.create_rectangle(x1, y1, x2, y2, fill=self.color, outline='') self.draw.rectangle([x1, y1, x2, y2], fill=self.color) def save_image(self): # 创建一个与画布相同大小的图像 x = self.canvas.winfo_width() y = self.canvas.winfo_height() self.image = Image.new("RGB", (x, y), "white") self.draw = ImageDraw.Draw(self.image) # 将画布上的所有图形绘制到Pillow图像上 self.canvas.update() self.canvas.postscript(file="temp_canvas.eps") # 导出为EPS文件 img = Image.open("temp_canvas.eps") # 用Pillow读取EPS文件 # 获取保存路径 file_path = filedialog.asksaveasfilename(defaultextension=".png", filetypes=[("PNG files", "*.png"), ("JPEG files", "*.jpg"), ("All files", "*.*")]) if file_path: img.save(file_path) # 保存为用户选择的路径 # 清理临时文件 import os if os.path.exists("temp_canvas.eps"): os.remove("temp_canvas.eps") def new_canvas(self): self.clear_canvas() def open_image(self): file_path = filedialog.askopenfilename(filetypes=[("PNG files", "*.png"), ("JPEG files", "*.jpg"), ("All files", "*.*")]) if file_path: self.clear_canvas() img = Image.open(file_path) self.image = img.convert("RGB") self.draw = ImageDraw.Draw(self.image) self.tk_image = self.image_to_tk(self.image) self.canvas.create_image(0, 0, anchor=tk.NW, image=self.tk_image) def image_to_tk(self, image): # Convert PIL image to PhotoImage image.thumbnail((800, 600)) # Resize image to fit canvas return ImageTk.PhotoImage(image) if __name__ == "__main__": root = tk.Tk() app = PaintApp(root) root.mainloop()
相关文章:

用python做一个简单的画板
一,画板的介绍 画板(Paint Board)是一个提供用户绘图、涂鸦和创作的平台。现代数字画板通常是由软件程序实现的,具有多种功能。以下是画板的一些主要特征和功能: 1. 基本绘图工具 画笔和铅笔:用户可以选…...
根据传入的文件流链接实现前端下载
后端传入一个下载的url,实现点击按钮,下载文件。 方式一: 通过window.open(“URL”, _blank) 方式 PS:会打开一个新的页面 import React from react;const DownloadButton () > {// window.open("URL", "_…...

大数据新视界 --大数据大厂之大数据环境下的零信任安全架构:构建可靠防护体系
💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…...

基于springboot的高校招生系统(含源码+sql+视频导入教程+文档+PPT)
👉文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 基于springboot的高校招生系统1拥有两种角色:管理员和用户 管理员:学生管理、专业管理、报名管理、录取通知管理、招生公告管理等 用户:登录注册、报…...
【C++设计模式】行为型模式:观察者模式
文章目录 行为型模式:观察者模式 行为型模式:观察者模式 观察者模式定义了一种一对多的依赖关系:它让一个主题(被观察者)对象关联多个观察者对象,并且当主题对象的状态发生变化时,它会主动通知…...
本篇5K,立志最细,FreeRtos中的信号量Semaphore教程详解!!!
前言:本篇教程,参考韦东山,开发文档,连接放在最后 目录 Semaphore基本概念 二值信号量(Binary Semaphore) 计数信号量(Couting Semaphore) 互斥信号量(Mutex&…...

【Postman】接口测试工具使用
干就完啦 Postman发送get请求案例1: Postman发送post请求案例2 Postman发送其他请求Postman测试实战 学习目标:能够使用Postman发送get/post/put/delete请求并获取响应结果 Postman发送get请求 首先postman是一款接口调试工具,支持win&…...

springboot 整合 rabbitMQ(1)
目录 一、MQ概述 二、MQ的优势和劣势 三、常见的MQ产品 RabbitMQ使用步骤 第一步:确保rabbitmq启动并且可以访问15672 第二步:导入依赖 第三步:配置 auto自动确认 manual手工确认(推荐使用!可以防止消息丢失&a…...

Appium Device Farm安装教程
环境要求:Appium version ≥ 2.4.X 安装appium npm install -g appium2.11.3 如果安装提示如下问题 npm error code EEXIST npm error syscall rename npm error path /Users/wan/.npm/_cacache/tmp/d5787519 npm error dest /Users/wan/.npm/_cacache/content-…...
异常、基类
异常 人生和世界总是充满着意外,争议、冲突和战争似乎是人类必然经历的过程。程序执行也有不满的时候。 不同编程语言的异常 Ada/Modula-3是早期引入异常处理的语言。 C语言没有标准意义的异常,使用goto或setjmp模拟错误或异常发生时的处理流程。 C/Java…...

VScode 自定义代码配色方案
vscode是一款高度自定义配置的编辑器, 我们来看看如何使用它自定义配色吧 首先自定义代码配色是什么呢? 看看我的代码界面 简而言之, 就是给你的代码的不同语义(类名, 函数名, 关键字, 变量)等设置不同的颜色, 使得代码的可读性变强. 其实很多主题已经给出了定制好的配色方案…...

MuMu模拟器12 KitsumeMask安装教程
这里是引用"> 在MuMu模拟器上安装KitsumeMask的时候遇到安装失败的情况。 一、下载APK安装包 如果你没有apk安装包可以通过下面的百度网盘进行下载 通过网盘分享的文件:KitsumeMask 链接: https://pan.baidu.com/s/1yeq3I6BsUD7J6uI-bnk-Vw?pwd=7n3v 提取码: 7n3v 二…...

Perforce静态分析工具2024.2新增功能:Helix QAC全新CI/CD集成支持、Klocwork分析引擎改进和安全增强
Perforce Helix QAC和Klocwork的最新版本对静态分析工具进行了重大改进,通过尽早修复错误、降低开发成本和加快发布速度,使开发团队实现左移。 本文中,我们将概述2024.2版本的新特性和新功能。 CI/CD和左移以实现持续合规性 现代软件开发实…...

太阳能电池特性及其应用
中南民族大学-通信工程2024-大学物理下实验 目录 代码实现结果显示 🛠工具使用 MarsCode(插件,集成在PyCharm); python编程(豆包AI智能体) 💻编程改进 此处是用「Matplotlib」来作图…...

日语学习零基础生活日语口语柯桥外语学校|股票用日语怎么说?
在日语中,“股票”可以说: • 株(かぶ) 这是最常用的表达方式,直接表示“股票”。 例如: 株を買う - 买股票 株を売る - 卖股票 • 株式(かぶしき) 这个词也是“股票”的意…...
第2关:寻找一个序列中的第K小的元素(即第k小元问题)
[TOC]寻找一个序列中的第K小的元素(即第k小元问题) 对于给定的含有n(n<100)元素的无序序列,求这个序列中第k(1≤k≤n)小的元素。 任务描述 本关任务:编写一个能计算数组中的第k小的元素的小程序。 相关…...

docker 搭建 vue3 + vite
vue3发布了,今天就分享一下我使用docker 搭建 vue3 vite 开发环境。至于为什么使用docker搭建,因为多版本可以快速切换,和本地环境避免冲突。好了话不多说我们开始吧。 1. 准备资料 Docker Desktop wsl2 ubuntu 下载地址 : https://www.docker.…...

【网易云音乐】--源代码分享
最近写了一个网易云音乐的音乐实现部分,是通过JavaScript和jQuery实现的,具体效果大家可以参照下面的视频 源代码分享 - git地址: 网易云音乐源代码 下面将着重讲解一下音乐实现部分 视频有点模糊,不好意思,在b站上添加视频的时候…...

股市大涨下的会展业创新者
近期,股市涨势强劲有力,各大指数普遍上扬,市场活力空前。与此同时,伴随全球经济逐步复苏及会展行业不断发展,上市展览公司机遇与挑战并存。国内外市场需求持续增长拓展了广阔发展空间,但同时行业竞争愈发激…...

工具篇-完整的 Git 项目管理工具教程(在命令框中使用 Git、在 IDEA 中使用 Git)
🔥博客主页: 【小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍ 文章目录 1.0 Git 概述 2.0 Git 的安装和配置 3.0 获取本地仓库 3.1 基础操作指令 3.2 分支 4.0 Git 远程仓库 4.1 创建远程仓库 4.2 配置 SSH 公钥 4.3 操作远程仓库 5.0 使用…...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...
Go 语言接口详解
Go 语言接口详解 核心概念 接口定义 在 Go 语言中,接口是一种抽象类型,它定义了一组方法的集合: // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的: // 矩形结构体…...
是否存在路径(FIFOBB算法)
题目描述 一个具有 n 个顶点e条边的无向图,该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序,确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数,分别表示n 和 e 的值(1…...

10-Oracle 23 ai Vector Search 概述和参数
一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI,使用客户端或是内部自己搭建集成大模型的终端,加速与大型语言模型(LLM)的结合,同时使用检索增强生成(Retrieval Augmented Generation &#…...

无人机侦测与反制技术的进展与应用
国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机(无人驾驶飞行器,UAV)技术的快速发展,其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统,无人机的“黑飞”&…...

uniapp手机号一键登录保姆级教程(包含前端和后端)
目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号(第三种)后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...

使用SSE解决获取状态不一致问题
使用SSE解决获取状态不一致问题 1. 问题描述2. SSE介绍2.1 SSE 的工作原理2.2 SSE 的事件格式规范2.3 SSE与其他技术对比2.4 SSE 的优缺点 3. 实战代码 1. 问题描述 目前做的一个功能是上传多个文件,这个上传文件是整体功能的一部分,文件在上传的过程中…...

Mac flutter环境搭建
一、下载flutter sdk 制作 Android 应用 | Flutter 中文文档 - Flutter 中文开发者网站 - Flutter 1、查看mac电脑处理器选择sdk 2、解压 unzip ~/Downloads/flutter_macos_arm64_3.32.2-stable.zip \ -d ~/development/ 3、添加环境变量 命令行打开配置环境变量文件 ope…...
用js实现常见排序算法
以下是几种常见排序算法的 JS实现,包括选择排序、冒泡排序、插入排序、快速排序和归并排序,以及每种算法的特点和复杂度分析 1. 选择排序(Selection Sort) 核心思想:每次从未排序部分选择最小元素,与未排…...
Shell 解释器 bash 和 dash 区别
bash 和 dash 都是 Unix/Linux 系统中的 Shell 解释器,但它们在功能、语法和性能上有显著区别。以下是它们的详细对比: 1. 基本区别 特性bash (Bourne-Again SHell)dash (Debian Almquist SHell)来源G…...