Django学习记录08——图表及文件上传案例

1.图表Echarts的应用

Apache ECharts

1.1 使用方法

引用echarts.js即可到官方文档中查询使用

1.2 常用图标的使用

图表展示页面的部署(主要展示折线图、柱状图、饼图)

{% block content %}<div class="container"><div class="panel panel-default"><div class="panel-heading"><h3 class="panel-title">折线图</h3></div><div class="panel-body"><div id="m1" style="width: 100%;height:500px;"></div></div></div><div class="row"><div class="col-sm-8"><div class="panel panel-default"><div class="panel-heading"><h3 class="panel-title">柱状图</h3></div><div class="panel-body"><div id="m2" style="width: 100%;height:400px;"></div></div></div></div><div class="col-sm-4"><div class="panel panel-default"><div class="panel-heading"><h3 class="panel-title">饼图</h3></div><div class="panel-body"><div id="m3" style="width: 100%;height:400px;"></div></div></div></div></div></div>
{% endblock %}

使用方法

var myChart = echarts.init(document.getElementById('m1')); 基于准备好的dom,初始化echarts实例 根据id获取展示的位置

option = {官方文档获取 }; 指定图表的配置项和数据

myChart.setOption(option); 使用刚指定的配置项和数据显示图表。

1.2.1 折线图

  • 官方文档代码

在这里插入图片描述

option = {title: {text: 'Stacked Line'},tooltip: {trigger: 'axis'},legend: {data: ['Email', 'Union Ads', 'Video Ads', 'Direct', 'Search Engine']},grid: {left: '3%',right: '4%',bottom: '3%',containLabel: true},toolbox: {feature: {saveAsImage: {}}},xAxis: {type: 'category',boundaryGap: false,data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']},yAxis: {type: 'value'},series: [{name: 'Email',type: 'line',stack: 'Total',data: [120, 132, 101, 134, 90, 230, 210]},{name: 'Union Ads',type: 'line',stack: 'Total',data: [220, 182, 191, 234, 290, 330, 310]},{name: 'Video Ads',type: 'line',stack: 'Total',data: [150, 232, 201, 154, 190, 330, 410]},{name: 'Direct',type: 'line',stack: 'Total',data: [320, 332, 301, 334, 390, 330, 320]},{name: 'Search Engine',type: 'line',stack: 'Total',data: [820, 932, 901, 934, 1290, 1330, 1320]}]
};
  • 使用

在html中id为m1的标签,展示折线图

    <script type="text/javascript">$(function () {initLine();})//初始化折线图function initLine() {// 基于准备好的dom,初始化echarts实例var myChart = echarts.init(document.getElementById('m1'));// 指定图表的配置项和数据var option = {title: {text: '分公司上半年业绩'},tooltip: {trigger: 'axis'},legend: {data: [数据]},grid: {left: '3%',right: '4%',bottom: '3%',containLabel: true},toolbox: {feature: {saveAsImage: {}}},xAxis: {type: 'category',boundaryGap: false,data: [数据]//待后端传来的数据},yAxis: {type: 'value'},series: [数据]//待后端传来的数据};//使用ajax请求从后台获取数据$.ajax({url: '/chart/line',type: 'get',dataType: 'json',success: function (res) {//在此对图标的x轴,y轴,图例等进行赋值if (res.status) {//重新赋值option.legend.data = res.data.legend_data;option.xAxis.data = res.data.x_data;option.series = res.data.series;// 使用刚指定的配置项和数据显示图表。myChart.setOption(option);}}})}</script>
  • 基本属性

title 图表标题的相关属性

legend 图例的相关属性

xAxis x轴的相关属性

series y轴展示内容的属性

  • 数据的获取

对于option{}中各属性的数据内容可从后端的视图函数(视图函数从数据库)中获取\

使用Aajx请求获取后台数据,并传给option

chart.py视图函数

def chart_line(request):"""构造折线图"""# 模拟从数据库获取数据legend_data = ['公司1', '公司2', '公司3', '公司4', '公司5']x_data = ['1月份', '2月份', '3月份', '4月份', '5月份', '6月份']series = [{'name': '公司1','type': 'line','stack': 'Total','data': [120, 1322, 1201, 134, 920, 2320, 210]},{'name': '公司2','type': 'line','stack': 'Total','data': [220, 1832, 191, 2324, 290, 3230, 310]},{'name': '公司3','type': 'line','stack': 'Total','data': [1510, 2232, 201, 1524, 190, 330, 410]},{'name': '公司4','type': 'line','stack': 'Total','data': [3230, 332, 3021, 334, 3930, 330, 320]},{'name': '公司5','type': 'line','stack': 'Total','data': [820, 932, 901, 934, 1290, 1330, 1320]}]data_dict = {'status': True,'data': {'legend_data':legend_data,'x_data': x_data,'series': series,}}return JsonResponse(data_dict)

以上在视图函数中模拟数据库数据传到前端中

数据传输到前端后,Ajax请求对option的各个属性进行赋值

option.legend.data = res.data.legend_data;
option.xAxis.data = res.data.x_data;
option.series = res.data.series;

1.2.2 柱状图

  • 官方文档代码

在这里插入图片描述

option = {xAxis: {type: 'category',data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']},yAxis: {type: 'value'},series: [{data: [120, 200, 150, 80, 70, 110, 130],type: 'bar'}]
};
  • 使用

在html中id为m2的标签,展示柱状图

    <script type="text/javascript">$(function () {initBar();})//初始化柱状图function initBar() {// 基于准备好的dom,初始化echarts实例var myChart = echarts.init(document.getElementById('m2'));// 指定图表的配置项和数据var option = {title: {text: '员工业绩',left: 'center',},tooltip: {},//图例legend: {data: [数据],//待后端传来的数据bottom: 0,},//x轴xAxis: {data: []  //待后端传来的数据},//y轴yAxis: {},series: []  //待后端传来的数据};//使用ajax请求从后台获取数据$.ajax({url: '/chart/bar',type: 'get',dataType: 'json',success: function (res) {//在此对图标的x轴,y轴,图例等进行赋值if (res.status) {//重新赋值option.legend.data = res.data.legend;option.xAxis.data = res.data.x_data;option.series = res.data.series;// 使用刚指定的配置项和数据显示图表。myChart.setOption(option);}}})}</script>
  • 基本属性

title 图表标题的相关属性

legend 图例的相关属性

xAxis x轴的相关属性

series y轴展示内容的属性

  • 数据的获取

对于option{}中各属性的数据内容可从后端的视图函数(视图函数从数据库)中获取\

使用Aajx请求获取后台数据,并传给option

chart.py视图函数

def chart_bar(request):# 模拟数据库获取图表数据   以下可使用数据库获取legend = ['YQY', 'WYT']x_data = ['1月', '2月', '3月', '4月', '5月', '6月']series = [{'name': 'YQY','type': 'bar','data': [5, 20, 36, 10, 10, 20],},{'name': 'WYT','type': 'bar','data': [15, 40, 86, 90, 22, 88]}]data_dict = {'status': True,'data': {'legend': legend,'x_data': x_data,'series': series,}}return JsonResponse(data_dict)

以上在视图函数中模拟数据库数据传到前端中

数据传输到前端后,Ajax请求对option的各个属性进行赋值

option.legend.data = res.data.legend;
option.xAxis.data = res.data.x_data;
option.series = res.data.series;

1.2.2 饼状图

  • 官方文档代码

在这里插入图片描述

option = {title: {text: 'Referer of a Website',subtext: 'Fake Data',left: 'center'},tooltip: {trigger: 'item'},legend: {orient: 'vertical',left: 'left'},series: [{name: 'Access From',type: 'pie',radius: '50%',data: [{ value: 1048, name: 'Search Engine' },{ value: 735, name: 'Direct' },{ value: 580, name: 'Email' },{ value: 484, name: 'Union Ads' },{ value: 300, name: 'Video Ads' }],emphasis: {itemStyle: {shadowBlur: 10,shadowOffsetX: 0,shadowColor: 'rgba(0, 0, 0, 0.5)'}}}]
};
  • 使用

在html中id为m3的标签,展示饼状图

    <script type="text/javascript">$(function () {initPie();})//初始化饼状图function initPie() {// 基于准备好的dom,初始化echarts实例var myChart = echarts.init(document.getElementById('m3'));// 指定图表的配置项和数据var option = {title: {text: '部门预算',subtext: '副标题',left: 'center'},tooltip: {trigger: 'item'},legend: {orient: 'vertical',left: 'left',bottom: 0,},series: [{name: '预算',type: 'pie',radius: '50%',data: [], //待后端传来的数据emphasis: {itemStyle: {shadowBlur: 10,shadowOffsetX: 0,shadowColor: 'rgba(0, 0, 0, 0.5)'}}}]};//使用ajax请求从后台获取数据$.ajax({url: '/chart/pie',type: 'get',dataType: 'json',success: function (res) {//在此对图标的x轴,y轴,图例等进行赋值if (res.status) {//重新赋值/*series: [{name: '预算',type: 'pie',radius: '50%',data: [],}]series 是一个仅有一个字典元素的列表,series[0]取列表第一个元素,也就是这个字典series 为仅含有一个字典元素的列表,series[0].data表示取出series列表的第一个字典元素的data键*/option.series[0].data = res.data;// 使用刚指定的配置项和数据显示图表。myChart.setOption(option);}}})}</script>
  • 基本属性

title 图表标题的相关属性

legend 图例的相关属性

xAxis x轴的相关属性

series y轴展示内容的属性

  • 数据的获取

对于option{}中各属性的数据内容可从后端的视图函数(视图函数从数据库)中获取\

使用Aajx请求获取后台数据,并传给option

chart.py视图函数

def chart_pie(request):'''构造饼图数据'''# 模拟从数据库获取数据series_data = [{'value': 1048, 'name': 'IT部门'},{'value': 735, 'name': '销售部'},{'value': 580, 'name': '宣传部'},]data_dict = {'status': True,'data': series_data,}return JsonResponse(data_dict)

以上在视图函数中模拟数据库数据传到前端中

数据传输到前端后,Ajax请求对option的各个属性进行赋值

option.series[0].data = res.data;

2.文件的上传

2.1 基础操作

html上传页面

<form method="post" enctype="multipart/form-data">{% csrf_token %}<input type="text" name="username"><input type="file" name="avatar"><input type="submit" value="提交">
</form>
def upload_file(request):if request.method == 'GET':return render(request, 'upload_file.html')file_object = request.FILES['photo']  # 获取文件对象print(file_object.name)  # 获取文件名称# 生成文件名为file_object.name的文件f = open(file_object.name, mode='wb')# 由于文件在内存一块一块的存储,利用循环遍历每一块,写入f中for chunk in file_object.chunks():  # chunks()读取文件对象的内容f.write(chunk)f.close()return HttpResponse('上传成功')

request.POST 返回所有数据的组成的数据对象
request.FILES返回所有文件组成的数据对象

enctype="multipart/form-data"   
form标签中若不加此字段,上传的文件以文件名的形式通过request.POST传过来:
<QueryDict: {'csrfmiddlewaretoken': ['6oGNXjBGaHzqFGywRFd7JQWXrY7fQwB6cEURubTTxemKDA789nRjb3Kv5MEgYnOE'], 'username': ['123'], 'photo': ['20220829_20471734.jpg']}>form标签加上此字段,上传的文件以文件的形式通过request.FILES传过来
<MultiValueDict: {}>

file_object = request.FILES['photo'] 获取文件对象(input框中name为photo的输入数据)
file_object.name 获取文件名称

f = open(file_object.name, mode='wb') 生成文件名为file_object.name的文件

# 由于文件在内存一块一块的存储,利用循环遍历每一块,写入f中
for chunk in file_object.chunks():  # chunks()读取文件对象的内容f.write(chunk)
f.close()

选择上传的图片后,点击提交按钮,图片会以post的方式传入视图函数,通过file_object = request.FILES['photo']获取文件对象,并且chunks()读取文件对象的内容,最终将图片下载到项目目录中

2.2通过文件批量上传数据

将excel中存在部门批量添加到部门列表中

在这里插入图片描述

部门页面增加批量上传按钮

<form method="post" enctype="multipart/form-data" action="/depart/multi">{% csrf_token %}<div class="form-group"><input type="file" name="exc"></div><input type="submit" value="上传" class="btn-primary btn-sm">
</form>
def depart_multi(request):"""批量添加excel文件内的数据"""# 1.获取上传的文件对象file_object = request.FILES.get("exc")print(file_object)# 2.对象传递给openpyxl,有openpyxl读取文件内容wb = load_workbook(file_object)sheet = wb.worksheets[0] # 获取表print(sheet) #<Worksheet "Sheet1">print(sheet.cell(2,1).value) #部门1# 3.循环获取每一个数据# 遍历sheet的每一行,从第二行开始for row in sheet.iter_rows(min_row=2):# 获取每行第一列的值title = row[0].value# 先判断部门是否存在flag = models.Department.objects.filter(title=title).exists()if not flag:models.Department.objects.create(title=title)return redirect('/depart/list')

file_object = request.FILES.get("exc") 获取上传的文件对象

wb = load_workbook(file_object)对象传递给openpyxl,有openpyxl读取文件内容

sheet = wb.worksheets[0] 获取表

sheet.iter_rows(min_row=2) 遍历sheet的每一行,从第二行开始

2.3 ModelForm实现文件上传

2.3.1 media的应用

  • static,存放静态文件的路径,包括:CSS、JS、项目图片。
  • media,用户在前端上传的数据的目录(文件均存在此文件的子文件中)。

media的启用

url.py中配置

from django.urls import path, re_path
from django.views.static import serve
from django.conf import settingsurlpatterns = [re_path(r'^media/(?P<path>.*)$', serve, {'document_root': settings.MEDIA_ROOT}, name='media'),]

settings.py中配置

import osMEDIA_ROOT = os.path.join(BASE_DIR, "media")
MEDIA_URL = "/media/"

完成操作后,可以通过http://localhost:8000/media/xxx 来访问文件(xxx表示文件相对media的位置)

2.3.2 ModelForm实现city展示案例

models.py

class City(models.Model):"""城市"""name = models.CharField(max_length=32,verbose_name="名称")count = models.IntegerField(verbose_name="人口")# 虽是FileField,但是本质上还是charFieldimg = models.FileField(verbose_name="Logo",max_length=128,upload_to="city/")

img = models.FileField(verbose_name="Logo",max_length=128,upload_to="city/")

**upload_to = xxx 上传到 media/xxx目录中(不写默认上传到media目录) **

此时上传的图片自动存储到media/city/1.png

ModelForm定义

class UpMoldelForm(BootStrapModelForm):bootstrap_exclude_fields = ['img']class Meta:model = models.Cityfields = ['name', 'count', 'img']

bootstrap_exclude_fields = ['img'] img字段不使用BootStrapModelForm的输入框样式

city_add.html

{% extends 'layout.html' %}{% block content %}<div class="panel panel-default"><div class="panel-heading">{{ title }}</div><div class="panel-body"><form class="form" method="post" enctype="multipart/form-data" novalidate>{% csrf_token %}{% for field in form %}<div class="form-group"><label>{{ field.label }}</label>{{ field }}<span style="color: red">{{ field.errors.0 }}</span>{#                        field.errors.0显示第一条错误即可#}</div>{% endfor %}<input type="submit" class="btn btn-success" value="提交"></form></div></div>
{% endblock %}

视图函数city_add()

def upload_ModelForm(request):""" 上传文件和数据"""if request.method == 'GET':# 构造添加输入框form = UpMoldelForm()context = {'form': form,'title': 'ModelForm',}return render(request, 'upload_ModelForm.html', context)form = UpMoldelForm(data=request.POST, files=request.FILES)if form.is_valid():# 对于文件来说,自动保存定义时的路径位置  默认在media下  (media/city)# 保存文件的路径和名称   img:city/blog.pngform.save()return redirect("/upload/city_list")context = {'form': form,'title': 'ModelForm',}return render(request, 'upload_ModelForm.html', context)

form = UpMoldelForm(data=request.POST, files=request.FILES) 获取前端的数据及文件

form.save() 在ModelForm中直接使用此语句进行保存数据到数据库**(数据库文件字段保存文件的路径和名称 img:city/blog.png)**

对于文件来说,自动保存定义时的路径位置 默认在media下 (media/city)

city_list.html

{% extends 'layout.html' %}{% block content %}<div style="margin-bottom: 10px"><a type="button" class="btn btn-success" href="/upload/ModelForm"><span class="glyphicon glyphicon-plus-sign"aria-hidden="true"></span> 添加城市</a></div><div class="panel panel-default"><div class="panel-heading">城市列表</div><div class="bs-example" data-example-id="hoverable-table"><table class="table table-hover"><thead><tr><th>ID</th><th>名称</th><th>人口</th><th>Logo</th></tr></thead><tbody>{% for obj in queryset %}<tr><td>{{ obj.id }}</td><td>{{ obj.name }}</td><td>{{ obj.count }}</td><td>{# obj.img图片相对于media的路径 #}<img src="/media/{{ obj.img }}" style="height: 40px"></td></tr>{% endfor %}</tbody></table></div></div>
{% endblock %}

city_list()的视图函数

def city_list(request):queryset = models.City.objects.all()return render(request, "city_list.html", {'queryset': queryset})

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

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

相关文章

Docker安装MySQL镜像实战分享

今天我们对Docker安装MySQL镜像进行实战分享&#xff0c;以更深入的了解容器的使用场景。我们在云付服务器Ubuntu环境上已经安装好了Docker&#xff0c;接下来我们开始安装mysql5.7版本&#xff0c;安装mysql有两种思路&#xff0c;直接拉取mysql镜像和自己做mysql镜像&#xf…

JAVA语言编写一个方法,两个Long参数传入,使用BigDecimal类,计算相除四舍五入保留2位小数返回百分数。

在Java中&#xff0c;你可以使用BigDecimal类来执行精确的浮点数计算&#xff0c;并且可以指定结果的小数位数。以下是一个方法&#xff0c;它接受两个Long类型的参数&#xff0c;并使用BigDecimal来计算它们的商&#xff0c;然后将结果四舍五入到两位小数&#xff0c;并返回一…

对猫毛过敏还想养猫怎么办?除毛好的宠物空气净化器品牌推荐

许多朋友喜欢猫咪&#xff0c;但与猫咪相处一段时间后&#xff0c;他们可能会出现鼻塞、打喷嚏和眼泪不断的情况。让我们来科普一下如何让那些容易过敏的家人与猫咪更好地相处吧。为什么会过敏呢&#xff1f;因为猫咪的唾液中含有一种叫做Fel d1的蛋白质&#xff0c;通过舔毛散…

GEE 依照范围裁剪 下载Sentinel-2数据

0. GEE介绍 Google Earth Engine&#xff08;GEE&#xff09; 是由Google开发的一种云端平台&#xff0c;旨在提供强大的地理空间数据处理和分析工具。GEE集成了大量的遥感影像数据和地理空间数据集&#xff0c;以及高性能的计算资源&#xff0c;使用户能够在云端高效地进行大规…

AI的归纳和演绎法

AI的归纳和演绎法分别是什么&#xff1f; AI的归纳和演绎法是两种常见的推理方法。 归纳法&#xff08;inductive reasoning&#xff09;是一种从特殊到一般的过程&#xff0c;在有限的实例观察中得出一般规律或原则。用简单的说法&#xff0c;就是从一些具体的事物或情况中总…

GDB调试入门笔记

文章目录 What&#xff1f;WhyHow安装GDB安装命令查看是否安装成功调试简单的程序预备一个程序调试 使用breakinfolistnextprintstep一些小技巧在gdb前shell日志功能watch point| catch point 调试core调试一个运行的程序 What&#xff1f; GDB是什么&#xff1f; 全称GNU sym…

1、MQ_介绍、优缺点、类型等

MQ介绍 1. MQ概述 MQ&#xff08;Message Queue&#xff09;&#xff1a;消息队列&#xff0c;是基础数据结构中FIFO&#xff08;first in first out&#xff09;的一种数据结构。一般用来解决流量削峰、应用解耦、异步处理等问题&#xff0c;实现高性能&#xff0c;高可用&a…

24计算机考研调剂 | 中国民用航空飞行学院

中国民用航空飞行学院计算机学院2024年研究生招生啦~ 考研调剂招生信息 学校:中国民航飞行学院 专业:工学->电子信息 年级:2024 招生人数:- 招生状态:正在招生中 联系方式:********* (为保护个人隐私,联系方式仅限APP查看) 补充内容 中国民用航空飞行学院计算机学院…

Kafka|处理 Kafka 消息丢失的有效措施

文章目录 消息丢失场景生产者端Kafka Broker消费者端 如何防止消息丢失生产者端Kafka Broker 端消费者端 扩展如何实现消费端的重试功能&#xff1f;有如何处理消息重复&#xff1f; 消息丢失是 Kafka 系统中一个严重的问题&#xff0c;可能会发生在生产者、Broker 或消费者任何…

鸿蒙实战开发:数据交互【RPC连接】

概述 本示例展示了同一设备中前后台的数据交互&#xff0c;用户前台选择相应的商品与数目&#xff0c;后台计算出结果&#xff0c;回传给前台展示。 样例展示 基础信息 RPC连接 介绍 本示例使用[ohos.rpc]相关接口&#xff0c;实现了一个前台选择商品和数目&#xff0c;后台…

RabbitMQ消息的重复消费问题

消息重复消费是分布式消息传递系统常见的一个问题。在RabbitMQ中&#xff0c;可以通过以下几种策略解决或者缓解消息重复消费的问题&#xff1a; 确保消息处理的幂等性&#xff1a;设计消费者的消息处理逻辑&#xff0c;确保即使消息被多次消费也不会对系统造成不良影响。 消息…

Java解决统计包含给定前缀的字符串

Java解决统计包含给定前缀的字符串 01 题目 给你一个字符串 jewels 代表石头中宝石的类型&#xff0c;另有一个字符串 stones 代表你拥有的石头。 stones 中每个字符代表了一种你拥有的石头的类型&#xff0c;你想知道你拥有的石头中有多少是宝石。 字母区分大小写&#xff0c…

【大数据】-- 创建 Paimon 外部表

如今&#xff0c;在数据湖三剑客&#xff08;delta lake、hudi、iceberg&#xff09;之上&#xff0c;又新出一派&#xff1a; apache paimon。我们恰好在工作中遇到&#xff0c;以下介绍在 dataworks 上&#xff0c;使用 maxcompute odps sql 创建 apache paimon 外部表的一些…

Claude3深夜震撼发布!模型特点分析,附使用教程

Claude3深夜震撼发布&#xff01;模型特点分析&#xff0c;附使用教程 引言 最新发布的Claude3引起了广泛关注&#xff0c;这次发布一举推出了三个不同类型的模型&#xff0c;分别是Claude 3 Haiku、Claude 3 Sonnet和Claude 3 Opus。每个模型都具有独特的特点和能力&#xff…

使用 Redis 进行高效数据缓存的 C# 实践

使用 Redis 进行高效数据缓存的 C# 实践 前言一、搭建 Redis 环境二、在 C# 中使用 Redis1. 安装 StackExchange.Redis2. 连接到 Redis 服务器3. 常用数据类型的操作4. 数据缓存实践5. 高级特性和性能优化6. 错误处理和异常处理 三、总结 前言 Redis 是一种开源的内存数据库&a…

深色系可视化界面看腻了,来点浅色系?安排,20页来了。

只要不放在大屏上展示&#xff0c;贝格前端工场还是非常推崇浅色系的可视化界面&#xff0c;把它作为配色的首选 。浅色系可视化界面具有以下几个优势&#xff1a; 清晰明了 浅色系界面通常使用明亮的颜色&#xff0c;如白色、浅灰色等&#xff0c;使界面元素更加清晰可见。这…

Linux内核基础 - list_splice_tail_init函数详解

解析 Linux Kernel 4.19 的 list_splice_tail_init 函数 摘要 本文档旨在解析 Linux 内核 4.19 版本中 list_splice_tail_init 函数的作用&#xff0c;这是一个处理内核链表的重要函数。通过此函数&#xff0c;可以将一个链表插入到另一个链表的尾部&#xff0c;并将源链表初…

Python 开发图形界面程序

用 Python 语言开发图形界面的程序&#xff0c;有2种选择&#xff1a; Tkinter 基于Tk的Python库&#xff0c;这是Python官方采用的标准库&#xff0c;优点是作为Python标准库、稳定、发布程序较小&#xff0c;缺点是控件相对较少。 PySide2/PySide6 基于Qt 的Python库&#x…

机器学习-面经(part7、无监督学习)

机器学习面经系列的其他部分如下所示&#xff1a; 机器学习-面经&#xff08;part1&#xff09; 机器学习-面经(part2)-交叉验证、超参数优化、评价指标等内容 机器学习-面经(part3)-正则化、特征工程面试问题与解答合集机器学习-面经(part4)-决策树共5000字的面试问题与解答…

【ArcGIS超级工具】基于ArcPy的矢量数据批量自动化入库工具

最近&#xff0c;有很多做规划的朋友私信我&#xff0c;想让我帮忙开发一款ArcGIS自动化脚本工具&#xff0c;实现点、线、面的自动化入库操作&#xff0c;帮他们在平时的内业数据处理工作中减少机械式重复性的工作&#xff0c;提高工作效率。为此&#xff0c;我详细了解了下目…