当前位置: 首页 > news >正文

tkinter Listbox 列表框实现多列对齐排列并绑定下拉框和滚动条

 


from tkinter import *
from tkinter import ttk, Button, Canvas, Listbox, Entry, LabelFrame, IntVar, Checkbutton, messageboximport win32print
root = Tk()
root.title("tkinter Listbox 列表框实现多列对齐排列")
root.geometry('550x450')def callback2(t, event=None):# 复制操作t.event_generate('<<Copy>>')def popup(top, t, event=None):menu = Menu(top, tearoff=False)menu.add_command(label="复制", command=lambda *e: callback2(t))menu.post(event.x_root, event.y_root)  # post在指定的位置显示弹出菜单def delete_item(listbox, all_data_dic0, printers_valus2):# 获取Listbox中所有被选中的项目selected_items = listbox.curselection()# 对选中的项目进行逆序排列,以免删除项目影响后面的索引# selected_items.reverse()item = selected_items[0]temp_value = listbox.get(item)# listbox.delete(item)if messagebox.askokcancel("删除", "确定删除吗?"):temp_value2 = all_data_dic0[item]delete_sql = f'delete from data_table where byname="%s"'# link.insert_one(delete_sql % temp_value2['Name0'])# register_form(printers_valus2=printers_valus2) # 刷新页面def on_entry_click(event, entry, default_value):# 鼠标点击输入框if entry.get() == default_value:# entry.delete(0, END)passelse:print(f'entry.get():{entry.get()} default_value:{default_value}')def on_mouse_leave(event, entry, default_value):# 鼠标离开事件if not entry.get().strip():entry.delete(0, END)entry.insert(0, default_value)def on_entry_clicked1(entry0, entry2, pos_name, printers_valus2, item_value1, new_child_window, listbox, item):# 保存修改数据byname = entry0.get().strip()sizename = entry2.get().strip()printername = pos_name.get()byname_old = item_value1['Name0']is_update = Falsesearch_sql = 'select id from data_table where byname="%s" and sizename="%s" and printername="%s"'# exist = link.one_search(search_sql % (byname, sizename, printername), "data_table")# print('exist:', exist)# if exist:#     print('此名称0已经存在')#     notification.notify(title='此名称0已经存在', message='此名称0已经存在', timeout=5)#     is_update = False# else:#     is_update = True## if is_update:#     update_sql = f'update data_table set byname="%s",sizename="%s",printername="%s" where byname="%s"'#     # print(update_sql % (byname, sizename, printername, byname_old))#     link.insert_one(update_sql % (byname, sizename, printername, byname_old))#     register_form(printers_valus2=printers_valus2) # 刷新页面new_child_window.destroy()def on_entry_clicked2(entry0, entry2, pos_name, printers_valus2, new_child_window):# 保存新增数据byname = entry0.get().strip()sizename = entry2.get().strip()printername = pos_name.get()search_sql = 'select id from data_table where byname="%s" and sizename="%s" and printername="%s"'# exist = link.one_search(search_sql % (byname, sizename, printername), "data_table")# if exist:#     print('此名称0已经存在')#     notification.notify(title='此名称0已经存在', message='此名称0已经存在', timeout=5)# else:#     sql = 'insert into data_table(byname, sizename, printername) values(%r,%r,%r)'#     link.insert_one(sql % (byname, sizename, printername))#     register_form(printers_valus2=printers_valus2)new_child_window.destroy()def create_frame(printers_valus2, event):# 创建一个新的Framenew_child_window = Toplevel()new_child_window.title('新增')# new_child_window.iconphoto(False, PhotoImage(data=iconphoto_path)) # 图标new_child_window.geometry(f'280x180+{event.x_root}+{event.y_root}')  # menu.post(event.x_root, event.y_root)label1 = Label(new_child_window, text='名称0:')label1.place(relx=0, rely=0.02, relheight=0.2, relwidth=0.55)entry0 = Entry(new_child_window, textvariable='name0')entry0.place(relx=0.46, rely=0.02, relheight=0.2, relwidth=0.45)# 插入默认值entry0.delete(0, END)entry0.insert(0, '名称1')# 绑定点击事件entry0.bind("<Button-1>", lambda event: on_entry_click(event, entry0, '名称1'))entry0.bind("<Leave>", lambda event: on_mouse_leave(event, entry0, '名称1'))label2 = Label(new_child_window, text='名称1:')label2.place(relx=0, rely=0.24, relheight=0.2, relwidth=0.55)entry2 = Entry(new_child_window, textvariable='name2')entry2.place(relx=0.46, rely=0.24, relheight=0.2, relwidth=0.45)# 插入默认值entry2.delete(0, END)entry2.insert(0, "70*50")# 绑定点击事件entry2.bind("<Button-1>", lambda event: on_entry_click(event, entry2, "70*50"))entry2.bind("<Leave>", lambda event: on_mouse_leave(event, entry2, "70*50"))# 选择名称2label3 = Label(new_child_window, text='选择名称2:', bd=3, width=16)label3.place(relx=0, rely=0.46, relwidth=0.55, relheight=0.2)# 获取默认打印机名称show_device_name = win32print.GetDefaultPrinter()if show_device_name not in printers_valus2:show_device_name = printers_valus2[0]# 下拉框pos_name = ttk.Combobox(new_child_window, width=20, height=10, textvariable=show_device_name, state='readonly')# 设置Combobox的下拉选项pos_name['values'] = printers_valus2pos_name.place(relx=0.46, rely=0.46, relwidth=0.45, relheight=0.2)if show_device_name in printers_valus2:pos_name.current(printers_valus2.index(show_device_name))else:pos_name.current(0)# 保存新增的数据confirm_btn = Button(new_child_window, text='确认', width=10,command=lambda: on_entry_clicked2(entry0, entry2, pos_name, printers_valus2,new_child_window))confirm_btn.place(relx=0.3, rely=0.72, relheight=0.2, relwidth=0.35)def edit_frame(event, item, all_data_dic0, printers_valus2, listbox):# 创建一个新的Frameitem_value = listbox.get(item)# print('item_value:', item_value)# print('item_value1:', all_data_dic0[item])item_value1 = all_data_dic0[item]new_child_window = Toplevel()new_child_window.title('编辑')# new_child_window.iconphoto(False, PhotoImage(data=iconphoto_path))  # 设置图标new_child_window.geometry(f'280x180+{event.x_root}+{event.y_root}')  # menu.post(event.x_root, event.y_root)label1 = Label(new_child_window, text='名称0:')label1.place(relx=0, rely=0.02, relheight=0.2, relwidth=0.55)entry0 = Entry(new_child_window, textvariable='name0')entry0.place(relx=0.46, rely=0.02, relheight=0.2, relwidth=0.45)# 插入默认值entry0.delete(0, END)entry0.insert(0, item_value1['Name0'])# 绑定点击事件entry0.bind("<Button-1>", lambda event: on_entry_click(event, entry0, item_value1['Name0']))entry0.bind("<Leave>", lambda event: on_mouse_leave(event, entry0, item_value1['Name0']))label2 = Label(new_child_window, text='名称1:')label2.place(relx=0, rely=0.24, relheight=0.2, relwidth=0.55)entry2 = Entry(new_child_window, textvariable='name2')entry2.place(relx=0.46, rely=0.24, relheight=0.2, relwidth=0.45)# 插入默认值entry2.delete(0, END)entry2.insert(0, item_value1['Name'])# 绑定点击事件entry2.bind("<Button-1>", lambda event: on_entry_click(event, entry2, item_value1['Name']))entry2.bind("<Leave>", lambda event: on_mouse_leave(event, entry2, item_value1['Name']))# 选择名称2label3 = Label(new_child_window, text='选择名称2:', bd=3, width=16)label3.place(relx=0, rely=0.46, relwidth=0.55, relheight=0.2)# 获取默认打印机设备show_device_name = item_value1['Name2']# 下拉框pos_name = ttk.Combobox(new_child_window, width=20, height=10, textvariable=show_device_name, state='readonly')printers_temp = ['OneNote for Windows 10', '导出为WPS PDF', 'Microsoft XPS Document Writer','Microsoft Print to PDF', 'Fax']# 设置Combobox的下拉选项pos_name['values'] = printers_valus2pos_name.place(relx=0.46, rely=0.46, relwidth=0.45, relheight=0.2)if show_device_name in printers_valus2:pos_name.current(printers_valus2.index(show_device_name))else:pos_name.current(0)# 保存修改的数据confirm_btn = Button(new_child_window, text='确认', width=10,command=lambda: on_entry_clicked1(entry0, entry2, pos_name, printers_valus2, item_value1,new_child_window, listbox, item))confirm_btn.place(relx=0.3, rely=0.72, relheight=0.2, relwidth=0.35)def get_display_width(s):width = 0for char in s:width += len(char.encode(sys.stdout.encoding))return widthdef show_menu(listbox, all_data_dic0, printers_valus2, event, top=None):# 根据当前位置获取Listbox中选中的项目try:item = listbox.curselection()[0]except IndexError:item = 0# 创建菜单,并添加选项menu = Menu(top, tearoff=0)if item > 0:menu.add_command(label="删除", command=lambda: delete_item(listbox, all_data_dic0, printers_valus2))menu.add_separator()  # 分割线menu.add_command(label="编辑",command=lambda: edit_frame(event, item, all_data_dic0, printers_valus2, listbox))menu.add_separator()  # 分割线menu.add_command(label="复制", command=lambda: callback2(listbox))menu.add_separator()  # 分割线# 如果选中了项目,就在菜单中显示项目的值if item or item == 0:menu.add_command(label="增加", command=lambda: create_frame(printers_valus2, event))# 在相应位置显示菜单menu.post(event.x_root, event.y_root)def show_listbox(printers_valus2, select_value=None):# 展示列表框内容scrollbar = Scrollbar(root)scrollbar.place(relx=0.85, rely=0.52, relheight=0.46, relwidth=0.035)listbox = Listbox(root, width=90, font='TkDefaultFont 11')listbox.place(relx=0.1, rely=0.52, relheight=0.46, relwidth=0.75)# 1. 从 sqlite3 中 读取数据# if not select_value or select_value == '全部':#     all_data = link.all_search('select byname,sizename,printername from data_table', 'data_table')# else:#     all_data = link.all_search(#         'select byname,sizename,printername from data_table where printername="%s"' % select_value, 'data_table')# allStudents = [{'Name0': i[0], 'Name': i[1], 'Name2': i[2]} for i in all_data]# 2. 测试数据allStudents_all = [{'Name0': 'USER', 'Name': '1041*1524', 'Name2': 'TSC TTP-244 Pro'},{'Name0': '100*100', 'Name': '1025*1000', 'Name2': 'TSC TTP-244 Pro'},{'Name0': '100*150', 'Name': '1025*1500', 'Name2': 'TSC TTP-244 Pro'},{'Name0': '100x100', 'Name': '250*150', 'Name2': 'TSC TTP-244 Pro'},{'Name0': '111', 'Name': '876*700', 'Name2': 'TSC TTP-244 Pro'},{'Name0': '2 x 4', 'Name': '533*1016', 'Name2': 'TSC TTP-244 Pro'},{'Name0': '4 x 4', 'Name': '1041*1016', 'Name2': 'TSC TTP-244 Pro'},{'Name0': '4 x 6', 'Name': '1041*1524', 'Name2': 'TSC TTP-244 Pro'},{'Name0': '45*30', 'Name': '475*300', 'Name2': 'TSC TTP-244 Pro'},{'Name0': '50*30', 'Name': '525*300', 'Name2': 'TSC TTP-244 Pro'},{'Name0': '70*30', 'Name': '725*300', 'Name2': 'TSC TTP-244 Pro'},{'Name0': '70*50', 'Name': '725*500', 'Name2': 'TSC TTP-244 Pro'},{'Name0': '新卷', 'Name': '525*300', 'Name2': 'TSC TTP-244 Pro'},{'Name0': '名称1', 'Name': '676*300', 'Name2': 'TSC TTP-244 Pro'},{'Name0': '名称2', 'Name': '1026*1500', 'Name2': 'TSC TTP-244 Pro'},{'Name0': 'USER', 'Name': '1041*1016', 'Name2': 'Gprinter GP-1324D'},{'Name0': '100*100', 'Name': '1025*1000', 'Name2': 'Gprinter GP-1324D'},{'Name0': '100*150', 'Name': '1025*1500', 'Name2': 'Gprinter GP-1324D'},{'Name0': '100x100', 'Name': '250*150', 'Name2': 'Gprinter GP-1324D'},{'Name0': '111', 'Name': '876*700', 'Name2': 'Gprinter GP-1324D'},{'Name0': '2 x 4', 'Name': '533*1016', 'Name2': 'Gprinter GP-1324D'},{'Name0': '4 x 4', 'Name': '1041*1016', 'Name2': 'Gprinter GP-1324D'},{'Name0': '4 x 6', 'Name': '1041*1524', 'Name2': 'Gprinter GP-1324D'},{'Name0': '45*30', 'Name': '475*300', 'Name2': 'Gprinter GP-1324D'},{'Name0': '50*30', 'Name': '525*300', 'Name2': 'Gprinter GP-1324D'},{'Name0': '70*30', 'Name': '725*300', 'Name2': 'Gprinter GP-1324D'},{'Name0': '70*50', 'Name': '725*500', 'Name2': 'Gprinter GP-1324D'},{'Name0': '新卷', 'Name': '525*300', 'Name2': 'Gprinter GP-1324D'},{'Name0': '名称1', 'Name': '676*300', 'Name2': 'Gprinter GP-1324D'},{'Name0': '名称2', 'Name': '1026*1500', 'Name2': 'Gprinter GP-1324D'}]if not select_value or select_value == '全部':allStudents = allStudents_allelse:allStudents = []for i in allStudents_all:if select_value in i['Name2']:allStudents.append(i)maxspace0 = get_display_width(max(allStudents, key=lambda x: get_display_width(x['Name0']))['Name0']) + 4maxspace = get_display_width(max(allStudents, key=lambda x: get_display_width(x['Name']))['Name']) + 4# 一个汉字占两个字符listbox.insert(END, f"{'名称0'.ljust(maxspace0 - 2)}  {'名称1'.ljust(maxspace - 2)}  名称2")all_data_dic0 = {}for i in range(len(allStudents)):tem = 0for l in allStudents[i]['Name0']:if get_display_width(l) > 1:tem += 1tem1 = 0for l1 in allStudents[i]['Name']:if get_display_width(l1) > 1:tem1 += 1text1 = f"{allStudents[i]['Name0'].ljust(maxspace0 - tem)}  {allStudents[i]['Name'].ljust(maxspace - tem1)}  {allStudents[i]['Name2']}"listbox.insert(END, text1)all_data_dic0[i + 1] = allStudents[i]listbox.configure(yscrollcommand=scrollbar.set)scrollbar.configure(command=listbox.yview)# 左键点击列表框中的值, 并执行后续操作# listbox.bind('<<ListboxSelect>>', lambda event: listbox_select(listbox.curselection(), listbox, event, all_data_dic, combobox, printers_valus2))# 绑定右键菜单listbox.bind("<Button-3>",lambda event: show_menu(listbox, all_data_dic0, printers_valus2, event))def update_listbox(event, printers_valus2, select_value):# 更新列表框的内容print('select_value:', select_value)show_listbox(printers_valus2, select_value)def register_form(printers_valus2=None):# 销毁所有滚动条和列表框# 与下拉框内容绑定combobox6 = ttk.Combobox(root, width=20, height=10)printers_temp = ['OneNote for Windows 10', '导出为WPS PDF', 'Microsoft XPS Document Writer', 'Microsoft Print to PDF','Fax']printers_valus3 = list(set(printers_valus2).difference(set(printers_temp)))printers_valus3.insert(0, '全部')print('printers_valus3:', printers_valus3)# 设置Combobox的下拉选项combobox6['values'] = printers_valus3combobox6.bind("<<ComboboxSelected>>", lambda event: update_listbox(event, printers_valus2, combobox6.get()))combobox6.place(relx=0.1, rely=0.43, relheight=0.08, relwidth=0.75)try:combobox6.current(0)except:pass# 展示列表框内容show_listbox(printers_valus2)register_form(['Gprinter GP-1324D', 'TSC TTP-244 Pro'])mainloop()

相关文章:

tkinter Listbox 列表框实现多列对齐排列并绑定下拉框和滚动条

from tkinter import * from tkinter import ttk, Button, Canvas, Listbox, Entry, LabelFrame, IntVar, Checkbutton, messageboximport win32print root Tk() root.title("tkinter Listbox 列表框实现多列对齐排列") root.geometry(550x450)def callback2(t, eve…...

Kafka 启用 JMX

以下是在 Kafka 服务启动时启用 JMX 的步骤&#xff1a; 找到 Kafka 的启动脚本&#xff0c;通常在 Kafka 安装目录的 bin 子目录下 编辑启动脚本&#xff08;例如 kafka-server-start.sh&#xff09;&#xff0c;在其中设置 JMX 参数。 在启动脚本中添加以下环境变量设置&a…...

G1(Garbage First)垃圾回收实战

GC过程 G1&#xff08;Garbage First&#xff09;是JVM中的一种垃圾回收器&#xff0c;设计用于处理具有大堆内存的应用程序&#xff0c;减少GC停顿时间&#xff0c;并提供更可预测的垃圾回收性能。G1的垃圾回收过程主要分为以下几个阶段&#xff1a; 1. 年轻代垃圾回收&…...

ESP32-IDF 通用定时器 GPTimer

目录 一、基本介绍1、配置结构体1.1 gptimer_config_t1.2 gptimer_event_callbacks_t1.3 gptimer_alarm_config_t 2、常用 API2.1 gptimer_new_timer2.2 gptimer_del_timer2.3 gptimer_set_raw_count2.4 gptimer_get_raw_count2.5 gptimer_get_resolution2.6 gptimer_get_captu…...

C#学习笔记(十)

C#学习笔记&#xff08;十&#xff09; 第七章 对象的构造方法与实例方法一、对象的构造方法1. 构造方法初识2. 构造方法的创建3. this关键字4. 构造方法的规范和重载4.1 构造方法的规范 5. 对象初始化器5.1 对象初始化器和构造方法的区别 二、对象的实例方法1. 简单应用2.实例…...

出手!快手可灵开源版,AI视频生成整合包!

在2024年&#xff0c;人工智能领域迎来了一位新星——AI视频生成技术。在这场技术革命中&#xff0c;快手推出的可灵AI无疑是最耀眼的明星之一。然而&#xff0c;其高昂的年费让不少用户望而却步&#xff0c;毕竟数千元的开销对于普通人来说是个不小的负担。 幸运的是&#xff…...

【Linux】进程池

目录 进程池 进程池的概念&#xff1a; 手搓进程池&#xff1a; 1、创建信道和子进程 2、通过channel控制子进程 3、回收管道和子进程 进程池 进程池的概念&#xff1a; 定义一个池子&#xff0c;在里面放上固定数量的进程&#xff0c;有需求来了&#xff0c;就拿一个池中…...

实验23:DA呼吸灯实验

电路硬件: 实现功能: 代码: public.h #ifndef _public_H #define _public_H#include "reg52.h" //#include "key.h"typedef unsigned int u16; typedef unsigned char u8;void delay_10us(u16 n); void delay_ms(u16 ms);#endif public.c #include …...

安科瑞智慧能源管理系统EMS3.0在浙江某能源集团有限公司的应用

安科瑞戴婷 Acrel-Fanny 一、项目背景 浙江某能源集团有限公司位于浙江省宁波前湾新区&#xff0c;主营业务范围包括了储能技术服务&#xff0c;光伏风力发电技术服务&#xff0c;充电桩技术服务&#xff0c;新能源项目的施工以及为企业提供配电房运维服务。 随着新能源的兴…...

线性代数学习

1.标量由只有一个元素的张量表示 import torchx torch.tensor([3,0]) y torch.tensor([2,0])x y, x * y, x / y, x**y 2.可以将向量视为标量值组成的列表 x torch.arange(4) x 3.通过张量的索引访问任一元素 x[3] 4.访问张量长度 len(x) 5.只有一个轴的张量&#xff0c…...

FineReport 数据显示格式

原始 修改 选择「单元格元素>格式」&#xff0c;选择「日期型」&#xff0c;改成 「yyyy 年 MM 月 dd 日」&#xff0c;如下图所示&#xff1a; 注&#xff1a;若列表中没有 yyyy 年 MM 月 dd 日 格式&#xff0c;可手动输入 选择运货费数据列单元格&#xff0c;选择「单元…...

leetcode.204.计数质数

#中等#枚举 给定整数 n &#xff0c;返回 所有小于非负整数 n 的质数的数量 。 埃氏筛 枚举没有考虑到数与数的关联性&#xff0c;因此难以再继续优化时间复杂度。接下来我们介绍一个常见的算法&#xff0c;该算法由希腊数学家厄拉多塞&#xff08;Eratosthenes&#xff09;提…...

Mysql环境安装

1&#xff0c;下载压缩包 下载压缩包解压 2&#xff0c;配置环境变量 i&#xff0c;高级系统设置-->环境变量-->系统变量-->path-->添加mysql的bin目录路径 ii&#xff0c;新建my.ini文件 basedir:MYSQL的路径 datadir&#xff1a;这个data路径不用手动创建&am…...

请问平面仓系统的盘点如何做?

盘点流程 一、盘点任务生成 手动发起&#xff1a;仓库管理人员可以根据实际需要&#xff0c;在系统中手动发起库存盘点任务。例如&#xff0c;定期进行全盘、抽盘或者在发现库存数据异常时发起盘点。自动触发&#xff1a;系统可以设置自动触发盘点的条件&#xff0c;如每隔一…...

STM32笔记(1)GPIO之点亮LED

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 总结 第一步&#xff1a;先看原理图。PB0输出高电平是&#xff0c;LED1点亮。 初始化完成了两项工作&#xff1a; (1)从时钟上启动所用GPIO所在的总线&#xff1b…...

自动化工具

自动化工具确保测试准确性的关键在于采取一系列综合性措施&#xff0c;包括但不限于以下几点&#xff1a; 环境一致性&#xff1a;确保测试环境与生产环境尽可能相似&#xff0c;减少环境差异导致的结果不准确。可以通过容器技术&#xff08;如Docker和Kubernetes&#xff09;确…...

CTFHUB技能树之HTTP协议——响应包源代码

开启靶场&#xff0c;打开链接&#xff1a; 是个贪吃蛇小游戏&#xff0c;看不出来有什么特别的地方 用burp抓包看看情况&#xff1a; 嗯&#xff1f;点击“开始”没有抓取到报文&#xff0c;先看看网页源代码是什么情况 居然直接给出flag了&#xff0c;不知道这题的意义何在 …...

Java会话技术,拦截器,过滤器,登录校验

目录 1.会话&#xff1a; 2.会话跟踪&#xff1a; 3.会话跟踪方案&#xff1a; 客户端会话跟踪技术&#xff1a;Cookie 服务端会话跟踪技术&#xff1a;Session JWT令牌技术(https://jwt.io/) 定义&#xff1a; 优点&#xff1a; 缺点&#xff1a; 组成&#xff1a; …...

Spring Security 如何进行权限验证

阅读本文之前&#xff0c;请投票支持这款 全新设计的脚手架 &#xff0c;让 Java 再次伟大&#xff01; FilterSecurityInterceptor FilterSecurityInterceptor 是负责权限验证的过滤器。一般来说&#xff0c;权限验证是一系列业务逻辑处理完成以后&#xff0c;最后需要解决的…...

计算机砖头书的学习建议

纸上得来终觉浅&#xff0c;绝知此事要躬行&#xff0c;技术来源于实践&#xff0c;光看不练意义不大&#xff0c;过阵子全忘记&#xff0c;并且没有实践来深化理论认知。 “砖头书”通常指的是那些厚重、内容详实且权威的书籍&#xff0c;对于计算机科学领域而言&#xff0c;…...

pam_env.so模块配置解析

在PAM&#xff08;Pluggable Authentication Modules&#xff09;配置中&#xff0c; /etc/pam.d/su 文件相关配置含义如下&#xff1a; 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块&#xff0c;负责验证用户身份&am…...

macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用

文章目录 问题现象问题原因解决办法 问题现象 macOS启动台&#xff08;Launchpad&#xff09;多出来了&#xff1a;Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显&#xff0c;都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

Python爬虫(二):爬虫完整流程

爬虫完整流程详解&#xff08;7大核心步骤实战技巧&#xff09; 一、爬虫完整工作流程 以下是爬虫开发的完整流程&#xff0c;我将结合具体技术点和实战经验展开说明&#xff1a; 1. 目标分析与前期准备 网站技术分析&#xff1a; 使用浏览器开发者工具&#xff08;F12&…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)

笔记整理&#xff1a;刘治强&#xff0c;浙江大学硕士生&#xff0c;研究方向为知识图谱表示学习&#xff0c;大语言模型 论文链接&#xff1a;http://arxiv.org/abs/2407.16127 发表会议&#xff1a;ISWC 2024 1. 动机 传统的知识图谱补全&#xff08;KGC&#xff09;模型通过…...

Spring Boot面试题精选汇总

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...

GitHub 趋势日报 (2025年06月08日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...

Web 架构之 CDN 加速原理与落地实践

文章目录 一、思维导图二、正文内容&#xff08;一&#xff09;CDN 基础概念1. 定义2. 组成部分 &#xff08;二&#xff09;CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 &#xff08;三&#xff09;CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 &#xf…...

React---day11

14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store&#xff1a; 我们在使用异步的时候理应是要使用中间件的&#xff0c;但是configureStore 已经自动集成了 redux-thunk&#xff0c;注意action里面要返回函数 import { configureS…...

Python Einops库:深度学习中的张量操作革命

Einops&#xff08;爱因斯坦操作库&#xff09;就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库&#xff0c;用类似自然语言的表达式替代了晦涩的API调用&#xff0c;彻底改变了深度学习工程…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现企业微信功能

1. 开发环境准备 ​​安装DevEco Studio 3.1​​&#xff1a; 从华为开发者官网下载最新版DevEco Studio安装HarmonyOS 5.0 SDK ​​项目配置​​&#xff1a; // module.json5 {"module": {"requestPermissions": [{"name": "ohos.permis…...