【Canvas与图标】橙色圆环文件图标

【成图】

1

2

3

4

5

6

【代码】

<!DOCTYPE html>
<html lang="utf-8">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<head>
     <title>橙色圆环文件图标 Draft2 图标</title>
     <style type="text/css">
     .centerlize{
        margin:0 auto;
        width:1200px;
     }
     </style>
     </head>

     <body onload="init();">
        <div class="centerlize">
            <canvas id="myCanvas" width="12px" height="12px" style="border:1px dotted black;">
                如果看到这段文字说您的浏览器尚不支持HTML5 Canvas,请更换浏览器再试.
            </canvas>
        </div>
     </body>
</html>
<script type="text/javascript">
<!--
/*****************************************************************
* 将全体代码(从<!DOCTYPE到script>)拷贝下来,粘贴到文本编辑器中,
* 另存为.html文件,再用chrome浏览器打开,就能看到实现效果。
******************************************************************/

// canvas的绘图环境
var ctx;

// 高宽
const WIDTH=120;
const HEIGHT=120;

// 舞台对象
var stage;

//-------------------------------
// 初始化
//-------------------------------
function init(){
    // 获得canvas对象
    var canvas=document.getElementById('myCanvas');  
    canvas.width=WIDTH;
    canvas.height=HEIGHT;

    // 初始化canvas的绘图环境
    ctx=canvas.getContext('2d');  
    ctx.translate(WIDTH/2,HEIGHT/2);// 原点平移

    // 准备
    stage=new Stage();    
    stage.init();

    // 开幕
    animate();
}

// 播放动画
function animate(){    
    stage.update();    
    stage.paintBg(ctx);
    stage.paintFg(ctx);     

    // 循环
    if(true){
        //sleep(100);
        window.requestAnimationFrame(animate);   
    }
}

// 舞台类
function Stage(){
    // 初始化
    this.init=function(){
        
    }

    // 更新
    this.update=function(){    
        
    }

    // 画背景
    this.paintBg=function(ctx){
        ctx.clearRect(-WIDTH/2,-HEIGHT/2,WIDTH,HEIGHT);// 清屏    
    }

    // 画前景
    this.paintFg=function(ctx){
        // 底色
        ctx.save();
        //ctx.fillStyle = "rgb(116,116,116)";
        //ctx.fillRect(-WIDTH/2,-HEIGHT/2,WIDTH,HEIGHT);
        ctx.restore();
        
        const R=55;//基准尺寸
        var ct=createPt(0,0);// ct=center

        // #1
        ctx.save();    
        var r=R*1.00;
        drawSolidCircle(ctx,ct.x,ct.y,r,"grey");        
        ctx.restore();

        // #2
        ctx.save();    
        var r=R*0.995;
        var top=createPt3(ct,r,-Math.PI/2);
        var bottom=createPt3(ct,r,Math.PI/2);
        var gnt=ctx.createLinearGradient(top.x,top.y,bottom.x,bottom.y);
        gnt.addColorStop(0,"rgb(250,250,250)");
        gnt.addColorStop(1,"rgb(240,240,240)");
        drawSolidCircle(ctx,ct.x,ct.y,r,gnt);        
        ctx.restore();

        // #3
        ctx.save();    
        var r=R*0.93;
        var top=createPt3(ct,r,-Math.PI/2);
        var bottom=createPt3(ct,r,Math.PI/2);
        var gnt=ctx.createLinearGradient(top.x,top.y,bottom.x,bottom.y);
        gnt.addColorStop(0,"rgb(251,186,0)");
        gnt.addColorStop(1,"rgb(255,63,0)");
        drawSolidCircle(ctx,ct.x,ct.y,r,gnt);        
        ctx.restore();

        // #3
        ctx.save();    
        var r=R*0.94;
        var gnt=ctx.createRadialGradient(ct.x,ct.y,0,ct.x,ct.y,r);
        gnt.addColorStop(0,"rgba(80,80,80,0.4)");
        gnt.addColorStop(0.9,"rgba(80,80,80,0.6)");
        gnt.addColorStop(1,"rgba(80,80,80,0.0)");
        drawSolidCircle(ctx,ct.x,ct.y,r,gnt);
        ctx.restore();

        // #4
        ctx.save();    
        var r=R*0.84;
        var top=createPt3(ct,r,-Math.PI/2);
        var bottom=createPt3(ct,r,Math.PI/2);
        var gnt=ctx.createLinearGradient(top.x,top.y,bottom.x,bottom.y);
        gnt.addColorStop(0,"rgb(253,253,253)");
        gnt.addColorStop(1,"rgb(218,218,218)");
        drawSolidCircle(ctx,ct.x,ct.y,r,gnt);        
        ctx.restore();

        // #5
        ctx.save();    
        var r=R*0.84;
        var w=r*0.7;
        var h=1.3*w;
        ctx.lineWidth=R/220*4;

        var center=createPt(ct.x,ct.y-r*0.24);
        ctx.strokeStyle="black";
        drawRect(ctx,center.x,center.y,w,h);// 外框
        ctx.stroke();

        var westNorth=createPt(center.x-w/2,center.y-h/2);
        var n=7;
        var yPart=h/n;
        for(var i=1;i<n;i++){
            var start=createPt(westNorth.x+w*0.1,westNorth.y+i*yPart);
            var end=createPt(westNorth.x+w*0.2,westNorth.y+i*yPart);
            ctx.beginPath();
            ctx.moveTo(start.x,start.y);
            ctx.lineTo(end.x,end.y);
            ctx.stroke();

            var start=createPt(westNorth.x+w*0.3,westNorth.y+i*yPart);
            var end=createPt(westNorth.x+w*0.9,westNorth.y+i*yPart);
            ctx.beginPath();
            ctx.moveTo(start.x,start.y);
            ctx.lineTo(end.x,end.y);
            ctx.stroke();
        }
        ctx.restore();

        // #6
        ctx.save();    
        var r=R*0.84;        
        writeText(ctx,ct.x,ct.y+r*0.78,"FILE",r*0.54+"px Noto Sans SC Black","black");
        ctx.restore();        

        //writeText(ctx,WIDTH/2-30,HEIGHT/2-5,"逆火制图","8px consolas","lightgrey");// 版权
    }
}

/*----------------------------------------------------------
基础函数:用于从角度取得弧度,便于微调
degree:角度值,如30,60,90
返回值:弧度值,如PI/6,PI/3,PI/2
----------------------------------------------------------*/
function getRadian(degree){
    return degree/180*Math.PI;
}

/*----------------------------------------------------------
基础函数:用于取得两点间距离
p1:起点
p1:终点
----------------------------------------------------------*/
function getDistance(p1,p2){
    return Math.sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));
}

/*----------------------------------------------------------
基础函数:用于绘制矩形
ctx:绘图上下文
x:矩形中心横坐标
y:矩形中心纵坐标
width:矩形宽
height:矩形高
----------------------------------------------------------*/
function drawRect(ctx,x,y,width,height){
    ctx.beginPath();
    ctx.moveTo(x-width/2,y-height/2);
    ctx.lineTo(x+width/2,y-height/2);
    ctx.lineTo(x+width/2,y+height/2);
    ctx.lineTo(x-width/2,y+height/2);
    ctx.closePath();
}

/*----------------------------------------------------------
基础函数:用于绘制实心圆
ctx:绘图上下文
x:矩形中心横坐标
y:矩形中心纵坐标
r:圆半径
style:填充圆的方案
----------------------------------------------------------*/
function drawSolidCircle(ctx,x,y,r,style){
    ctx.fillStyle=style;
    ctx.beginPath();
    ctx.arc(x,y,r,0,Math.PI*2,false);
    ctx.closePath();
    ctx.fill();
}

/*----------------------------------------------------------
基础函数:创建一个二维坐标点
base:基准点,入参必需有x和y两参数
radius:当前点到基准点的距离
theta:当前点到基准点的角度
Pt即Point
----------------------------------------------------------*/
function createPt3(base,radius,theta){
    var retval={};
    retval.x=base.x+radius*Math.cos(theta);
    retval.y=base.y+radius*Math.sin(theta);
    return retval;
}

/*----------------------------------------------------------
基础函数:创建一个二维坐标点
baseX:基准点横坐标
baseY:基准点纵坐标
radius:当前点到基准点的距离
theta:当前点到基准点的角度
Pt即Point
----------------------------------------------------------*/
function createPt2(baseX,baseY,radius,theta){
    var retval={};
    retval.x=baseX+radius*Math.cos(theta);
    retval.y=baseY+radius*Math.sin(theta);
    return retval;
}

/*----------------------------------------------------------
基础函数:创建一个二维坐标点
x:横坐标
y:纵坐标
Pt即Point
----------------------------------------------------------*/
function createPt(x,y){
    var retval={};
    retval.x=x;
    retval.y=y;
    return retval;
}

/*----------------------------------------------------------
基础函数:延时若干毫秒
milliseconds:毫秒数
----------------------------------------------------------*/
function sleep(milliSeconds) {
    const date = Date.now();
    let currDate = null;
    while (currDate - date < milliSeconds) {
        currDate = Date.now();
    } 
}

/*----------------------------------------------------------
基础函数:书写文字
ctx:绘图上下文
x:横坐标
y:纵坐标
text:文字
font:字体
color:颜色
----------------------------------------------------------*/
function writeText(ctx,x,y,text,font,color){
    ctx.save();
    ctx.textBaseline="bottom";
    ctx.textAlign="center";
    ctx.font = font;
    ctx.fillStyle=color;
    ctx.fillText(text,x,y);
    ctx.restore();
}

/*-------------------------------------------------------------
诺奖主要还是奖励那些能耐心研究从0到1的科学家,
搞这种研究,一般是吃力不讨好,难以出成果的。
很多诺奖获得者,特别是物理化学医学等,他们大多有个共同点--
淡泊名利,几十年如一日的干一件事。
而我们的环境是不允许如此,我们所有的一切都是设立短期目标,
都是功利主义,而且都喜欢急功近利,在这种社会环境下没人耐下心来干事。
--------------------------------------------------------------*/
//-->
</script>

END

分布式微服务企业级系统是一个基于Spring、SpringMVC、MyBatis和Dubbo等技术的分布式敏捷开发系统架构。该系统采用微服务架构和模块化设计,提供整套公共微服务模块,包括集中权限管理(支持单点登录)、内容管理、支付中心、用户管理(支持第三方登录)、微信平台、存储系统、配置中心、日志分析、任务和通知等功能。系统支持服务治理、监控和追踪,确保高可用性和可扩展性,适用于中小型企业的J2EE企业级开发解决方案。 该系统使用Java作为主要编程语言,结合Spring框架实现依赖注入和事务管理,SpringMVC处理Web请求,MyBatis进行数据持久化操作,Dubbo实现分布式服务调用。架构模式包括微服务架构、分布式系统架构和模块化架构,设计模式应用了单例模式、工厂模式和观察者模式,以提高代码复用性和系统稳定性。 应用场景广泛,可用于企业信息化管理、电子商务平台、社交应用开发等领域,帮助开发者快速构建高效、安全的分布式系统。本资源包含完整的源码和详细论文,适合计算机科学或软件工程专业的毕业设计参考,提供实践案例和技术文档,助力学生和开发者深入理解微服务架构和分布式系统实现。 【版权说明】源码来源于网络,遵循原项目开源协议。付费内容为本人原创论文,包含技术分析和实现思路。仅供学习交流使用。
import tkinter as tk import ttkbootstrap as tb import math from ttkbootstrap.constants import * import random class CircularProgressBar: def __init__(self, parent, size=200, thickness=20, bg_color="#e0e0e0", fg_color="#4caf50", text_color="#333333", font_size=20, speed_unit="KB/s"): self.parent = parent self.size = size self.thickness = thickness self.bg_color = bg_color self.fg_color = fg_color self.text_color = text_color self.font_size = font_size self.speed_unit = speed_unit style = tb.Style() parent_bg = style.colors.get("bg") if hasattr(style, "colors") else "#f0f0f0" # 创建 Canvas self.canvas = tk.Canvas( parent, width=size, height=size, background=parent_bg, # 使用background而非bg highlightthickness=0 ) self.canvas.pack(padx=20, pady=20) # 计算圆心和半径 self.center_x = size / 2 self.center_y = size / 2 self.radius = (size - thickness) / 2 # 绘制背景圆环 self.draw_background() # 创建进度弧 self.arc_id = self.canvas.create_arc( self.center_x - self.radius, self.center_y - self.radius, self.center_x + self.radius, self.center_y + self.radius, start=90, extent=0, style=tk.ARC, outline=fg_color, width=thickness ) # 创建中心传输速度文本 self.text_id = self.canvas.create_text( self.center_x, self.center_y, text=f"0 {self.speed_unit}", fill=text_color, font=("Arial", font_size, "bold") ) # 当前进度值 self.current_progress = 0 self.target_progress = 0 self.animation_running = False def draw_background(self): """绘制背景圆环""" self.canvas.create_oval( self.center_x - self.radius, self.center_y - self.radius, self.center_x + self.radius, self.center_y + self.radius, outline=self.bg_color, width=self.thickness ) def format_speed(self, speed): """格式化速度显示""" if self.speed_unit == "KB/s": return f"{speed:.1f} KB/s" elif self.speed_unit == "MB/s": return f"{speed:.2f} MB/s" elif self.speed_unit == "Mbps": return f"{speed:.1f} Mbps" else: return f"{speed} {self.speed_unit}" def set_progress(self, value, speed): """设置目标进度值(0-100)和传输速度""" self.target_progress = max(0, min(100, value)) # 更新传输速度显示 formatted_speed = self.format_speed(speed) self.canvas.itemconfig(self.text_id, text=formatted_speed) # 如果动画未运行,则启动动画 if not self.animation_running: self.animate_progress() def animate_progress(self): """平滑动画更新进度""" self.animation_running = True # 计算步长(确保动画平滑) step = 1 if abs(self.target_progress - self.current_progress) < 5 else 2 # 更新当前进度 if self.current_progress < self.target_progress: self.current_progress += step if self.current_progress > self.target_progress: self.current_progress = self.target_progress else: self.current_progress -= step if self.current_progress < self.target_progress: self.current_progress = self.target_progress # 计算弧的角度(360度 * 进度百分比) angle = 360 * (self.current_progress / 100) # 更新弧 self.canvas.itemconfig(self.arc_id, extent=-angle) # 更改颜色基于进度 if self.current_progress < 30: self.canvas.itemconfig(self.arc_id, outline="#f44336") # 红色 elif self.current_progress < 70: self.canvas.itemconfig(self.arc_id, outline="#ff9800") # 橙色 else: self.canvas.itemconfig(self.arc_id, outline=self.fg_color) # 绿色 # 如果未达到目标,继续动画 if self.current_progress != self.target_progress: self.canvas.after(20, self.animate_progress) else: self.animation_running = False def set_speed_unit(self, unit): """设置速度单位""" self.speed_unit = unit class ProgressApp: def __init__(self): self.root = tb.Window(themename="minty", title="传输速度监控", size=(500, 700)) self.root.iconbitmap("") # 移除默认图标 # 创建主框架 main_frame = tb.Frame(self.root, padding=20) main_frame.pack(fill=tk.BOTH, expand=True) # 标题 tb.Label( main_frame, text="传输速度监控演示", font=("Helvetica", 18, "bold"), bootstyle=PRIMARY ).pack(pady=(0, 20)) # 创建圆形进度条 self.progress_bar = CircularProgressBar( main_frame, size=220, thickness=18, bg_color="#e0e0e0", fg_color="#4caf50", speed_unit="KB/s" ) # 控制面板 control_frame = tb.Frame(main_frame) control_frame.pack(pady=20, fill=tk.X) # 进度滑块 tb.Label(control_frame, text="设置进度:", bootstyle=PRIMARY).pack(anchor=tk.W) self.slider = tb.Scale( control_frame, from_=0, to=100, orient=tk.HORIZONTAL, length=300, command=self.update_progress_from_slider ) self.slider.pack(fill=tk.X, pady=10) self.slider.set(0) # 速度滑块 tb.Label(control_frame, text="设置传输速度:", bootstyle=PRIMARY).pack(anchor=tk.W, pady=(10, 0)) self.speed_slider = tb.Scale( control_frame, from_=0, to=1000, orient=tk.HORIZONTAL, length=300, command=self.update_speed ) self.speed_slider.set(100) self.speed_slider.pack(fill=tk.X, pady=10) # 按钮框架 btn_frame = tb.Frame(control_frame) btn_frame.pack(fill=tk.X, pady=10) # 速度单位选择器 unit_frame = tb.Frame(control_frame) unit_frame.pack(fill=tk.X, pady=10) tb.Label(unit_frame, text="速度单位:", bootstyle=PRIMARY).pack(anchor=tk.W) self.unit_var = tk.StringVar(value="KB/s") units = ["KB/s", "MB/s", "Mbps"] for unit in units: tb.Radiobutton( unit_frame, text=unit, variable=self.unit_var, value=unit, bootstyle=PRIMARY, command=self.change_unit ).pack(side=tk.LEFT, padx=5) # 自动进度按钮 tb.Button( control_frame, text="模拟传输过程", bootstyle=SUCCESS, command=self.auto_progress ).pack(pady=10) # 主题选择器 theme_frame = tb.Frame(control_frame) theme_frame.pack(fill=tk.X, pady=10) tb.Label(theme_frame, text="选择主题:", bootstyle=PRIMARY).pack(anchor=tk.W) self.theme_var = tk.StringVar(value="minty") themes = ["minty", "cosmo", "flatly", "journal", "darkly", "solar"] for theme in themes: tb.Radiobutton( theme_frame, text=theme.capitalize(), variable=self.theme_var, value=theme, bootstyle=PRIMARY, command=self.change_theme ).pack(side=tk.LEFT, padx=5) # 状态栏 self.status = tb.Label( self.root, text="准备就绪", bootstyle=(SECONDARY, INVERSE), anchor=tk.CENTER ) self.status.pack(side=tk.BOTTOM, fill=tk.X) # 当前传输速度 self.current_speed = 100 # 初始速度 100 KB/s self.root.mainloop() def set_progress(self, value): """设置进度值""" self.slider.set(value) self.progress_bar.set_progress(value, self.current_speed) self.status.config(text=f"进度设置为: {value}%, 速度: {self.current_speed:.1f} KB/s") def update_progress_from_slider(self, value): """滑块更新进度""" self.progress_bar.set_progress(float(value), self.current_speed) self.status.config(text=f"进度更新为: {int(float(value))}%, 速度: {self.current_speed:.1f} KB/s") def update_speed(self, value): """更新传输速度""" self.current_speed = float(value) # 更新进度条显示当前速度 self.progress_bar.set_progress(self.slider.get(), self.current_speed) self.status.config(text=f"传输速度更新为: {self.current_speed:.1f} KB/s") def change_unit(self): """更改速度单位""" unit = self.unit_var.get() self.progress_bar.set_speed_unit(unit) # 更新显示当前速度 self.progress_bar.set_progress(self.slider.get(), self.current_speed) self.status.config(text=f"速度单位已切换为: {unit}") def auto_progress(self): """自动传输过程演示""" self.status.config(text="传输过程模拟中...") self.root.after(1000, self._auto_progress_step, 0) def _auto_progress_step(self, step): """自动传输步骤""" progress = step % 101 # 模拟速度变化:正弦波 + 随机波动 base_speed = 200 + 150 * math.sin(step * 0.1) random_factor = random.uniform(0.8, 1.2) self.current_speed = base_speed * random_factor # 更新显示 self.slider.set(progress) self.progress_bar.set_progress(progress, self.current_speed) self.status.config(text=f"进度: {progress}%, 速度: {self.current_speed:.1f} KB/s") if step < 100: # 根据进度调整速度 delay = 100 # 固定延迟模拟实时更新 self.root.after(delay, self._auto_progress_step, step + 1) else: self.status.config(text="传输过程模拟完成") def change_theme(self): """更改应用主题""" theme = self.theme_var.get() style = tb.Style(theme=theme) self.status.config(text=f"主题已切换为: {theme.capitalize()}") if __name__ == "__main__": ProgressApp()再把传输进度以百分比的形式显示在传输速率上方但不要超出圆环
06-14
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值