Thinkphp 前端页面获取get值

{:request()->get(‘id/d’)}
调用上面的函数可以获得 get类型的id并初始化为数字形式

发表在 None | 留下评论

python打包 pyinstaller PIL

带logo 无黑框打包

pyinstaller -F -w -i logo.ico x.py

无logo 无黑框

pyinstaller -F -w x.py

普通打包 一个 单文件exe 有黑框

pyinstaller -F x.py

普通打包 非单文件exe有黑框

pyinstaller x.py

PIL 打包坑点 需要指定 字体

#否则会失败

options = {
    'module_width': 0.24,
    'module_height':6.0,
    'font_size': 8,
    'text_distance': 3,
    'quiet_zone':4,
    'font_path': r'C:\Windows\Fonts\arial.ttf',  # Arial字体(纯数字/英文)
}
发表在 None | 留下评论

Tkinter 输入回车返回

import tkinter as tk
from tkinter import messagebox

def submit_content(event=None):
    """
    提交输入框内容的核心函数
    event 参数:绑定键盘事件时会自动传入,需保留(设为默认None兼容按钮点击)
    """
    # 获取输入框内容并去除首尾空格
    content = entry.get().strip()
    
    # 空值校验
    if not content:
        messagebox.warning("提示", "输入框不能为空!")
        # 清空输入框并让输入框重新获得焦点
        entry.delete(0, tk.END)
        entry.focus()
        return
    
    # 处理提交逻辑(这里仅做演示,你可以替换为自己的业务代码)
    messagebox.showinfo("提交成功", f"你提交的内容是:{content}")
    
    # 提交后清空输入框并保持焦点,方便继续输入
    entry.delete(0, tk.END)
    entry.focus()

# 创建主窗口
root = tk.Tk()
root.title("回车提交输入框内容")
root.geometry("400x200")

# 创建输入框
entry = tk.Entry(
    root,
    font=("Arial", 14),
    width=30
)
entry.pack(pady=30)

# 核心:绑定回车键事件(<Return> 对应回车键)
entry.bind("<Return>", submit_content)

# 可选:添加提交按钮(兼容鼠标点击场景)
submit_btn = tk.Button(
    root,
    text="提交",
    font=("Arial", 12),
    command=submit_content  # 直接调用函数,无需传参(因为event设为默认None)
)
submit_btn.pack()

# 让输入框默认获得焦点,打开窗口即可直接输入
entry.focus()

# 运行主循环
root.mainloop()
发表在 None | 留下评论

打印机 python使用 Pillow pywin32

import barcode
from barcode.writer import ImageWriter
from PIL import Image,ImageWin
import win32print
import win32ui

options = {
    'module_width': 0.24,
    'module_height':6.0,
    'font_size': 8,
    'text_distance': 3,
    'quiet_zone':4,
}


def print_img(image_path):
    mr_id=0
    has_750=False
    done=False
    printers = [printer[2] for printer in win32print.EnumPrinters(2)]
    for i, printer in enumerate(printers):
        # print(f"{i+1}: {printer}")
        if '750' in printer:
            mr_id=i
            has_750=True
            printer_name=printers[i]
    if has_750:
        print("已经提交给打印机",printer_name,"打印条码")
        image = Image.open(image_path)
        hDC = win32ui.CreateDC()
        hDC.CreatePrinterDC(printer_name)
        hDC.StartDoc(image_path)
        hDC.StartPage()
        dib = ImageWin.Dib(image)
        dib.draw(hDC.GetHandleOutput(), (0, 0, image.width, image.height))
        hDC.EndPage()
        hDC.EndDoc()
        del hDC
        done=True
    return done

def makeCode(code):
    Code128 = barcode.get_barcode_class('code128')
    code128 = Code128(code, writer=ImageWriter())
    filename = code128.save('print_swap',options=options)
    image_path=filename
    print_img(image_path)


code='HTA101CWGL0120260001'
makeCode(code)


通用打印代码(函数)

下面的A4 72dpi下的打印分辨率:dib.draw(hDC.GetHandleOutput(), (0, 0, 5040, 7128)) ,windows下打印机是按照DPI来的!切记切记。

不要忘记安装pillow 和pywin32的包

from PIL import Image,ImageWin
import win32print
import win32ui

def print_img(image_path):
    #设置打印机名称
    printer_name='1806'
    mr_id=0
    has_printer=False
    done=False
    printers = [printer[2] for printer in win32print.EnumPrinters(2)]
    for i, printer in enumerate(printers):
        # print(f"{i+1}: {printer}")
        if printer_name in printer:
            mr_id=i
            has_printer=True
            printer_name=printers[i]
    if has_printer:
        print("已经提交给打印机",printer_name,"打印首页")
        image = Image.open(image_path)
        hDC = win32ui.CreateDC()
        hDC.CreatePrinterDC(printer_name)
        hDC.StartDoc(image_path)
        hDC.StartPage()
        dib = ImageWin.Dib(image)
        # dib.draw(hDC.GetHandleOutput(), (0, 0, image.width, image.height))
        dib.draw(hDC.GetHandleOutput(), (0, 0, 5040, 7128))
        hDC.EndPage()
        hDC.EndDoc()
        del hDC
        done=True
    return done
发表在 None | 留下评论

llamaindex 向量化VectorStoreIndex

1.使用VectorStoreIndex简单实用:VectorStoreIndex.from_documents(documents)读取文档。Documents

2.使用读取切分好的节点(常用)VectorStoreIndex(nodes) 切分好的节点。

不常用:查询query_engine=index.as_query_engine(similarity_top=3) 查询 query_engine.query("xxxxxx?") 即可


chroma设置

首先需要导入

import chromadb
from llama_index.vector_stores.chroma import ChromaVectorStore


from llama_index.core import SimpleDirectoryReader,VectorStoreIndex,Settings,StorageContext,load_index_from_storage

创建chroma存储目录以及集合名词

# chroma初始化 存储目录
chroma_client=chromadb.PersistentClient(path="./storage/chroma")
#chroma的向量集合
chroma_context=chroma_client.get_or_create_collection("My_collection")

使用llama_index加入刚刚创建的db 中的合集转为chromavectorstore对象并最终转为Storage对象用于处理

# 使用llama_index 来使用chroma库 导入建刚刚创建的chroma集合 导入向量库
vector_store=ChromaVectorStore(chroma_collection=chroma_context)
#整合向量存储的方法 用于下面的保存操作 index=VectorStoreIndex(new_nodes,storage_context=storage_context)
storage_context=StorageContext.from_defaults(vector_store=vector_store)

向量化 及关联使用storage对象,最终使用persist方法存储 (persist_dir 其中还存储向量与节点关系数据【Chroma 存向量,persist 存关联】)

index=VectorStoreIndex(new_nodes,storage_context=storage_context)
# 该处负责存储,需要执行后才能存储 且制定了目录。必须使用persist_dir 其中还存储向量与节点关系数据
index.storage_context.persist(persist_dir="./storage")

载入chroma的合集

#并将对象转唯llamaindex到ChromeVectorStore向量对象

loaded_client=chromadb.PersistentClient(path='./storage/chroma')
loaded_collection=loaded_client.get_collection("My_collection")

#载入chroma文件中的collection到向量对象

loaded_vector_store=ChromaVectorStore(chroma_collection=loaded_collection)

# 使用StorageContext 载入转为Storage对象用于载入

loaded_storage_context=StorageContext.from_defaults(

    persist_dir="./storage",

    vector_store=loaded_vector_store

)

#将storage对象转为可用的index,后续用于查询

index=load_index_from_storage(loaded_storage_context)

query_engine=index.as_query_engine(similarity_top_k=3)

ee=query_engine.query("where is Link")

print(ee)

整体DEMO代码

from llama_index.core import SimpleDirectoryReader,VectorStoreIndex,Settings,StorageContext,load_index_from_storage
from llama_index.core.node_parser import SentenceSplitter
from llama_index.retrievers import bm25
# from llama_index.core.retrievers import BM25Retriever
from llama_index.llms.ollama import Ollama
from llama_index.embeddings.ollama import OllamaEmbedding
import jieba
import time
import joblib
import chromadb
from llama_index.vector_stores.chroma import ChromaVectorStore


OLLAMA_URL="http://127.0.0.1:11434"
EMBED_MODEL="qwen3-embedding:0.6b"
LLM_MODEL="qwen3:0.6b"

Settings.embed_model=OllamaEmbedding(
    model_name=EMBED_MODEL,base_url=OLLAMA_URL
)
Settings.llm=Ollama(
    model=LLM_MODEL,base_url=OLLAMA_URL
)

# chroma初始化 存储目录
chroma_client=chromadb.PersistentClient(path="./storage/chroma")
#chroma的向量集合
chroma_context=chroma_client.get_or_create_collection("My_collection")

# 使用llama_index 来使用chroma库 导入建刚刚创建的chroma集合 导入向量库
vector_store=ChromaVectorStore(chroma_collection=chroma_context)
#整合向量存储的方法 用于下面的保存操作 index=VectorStoreIndex(new_nodes,storage_context=storage_context)
storage_context=StorageContext.from_defaults(vector_store=vector_store)

documents=SimpleDirectoryReader("data").load_data()

print(documents)

splitter=SentenceSplitter(chunk_size=512,chunk_overlap=30)

new_nodesx=splitter.get_nodes_from_documents(documents)

print(new_nodesx)

documents=SimpleDirectoryReader(input_files=["add.docx",]).load_data()

print(documents)

documents[0].metadata['MAC']='adgfa-192ga'
documents[0].metadata['document_id']=documents[0].id_

print(documents)
new_nodes=splitter.get_nodes_from_documents(documents)
print(new_nodes)

class ChineseBM25Retriever(bm25.BM25Retriever):
    def _tokenize(self,text):
        return [w for w in jieba.cut(text) if w.strip()]

c=time.time()
retriever=ChineseBM25Retriever(nodes=new_nodes,similarity_top_k=10)
print(time.time()-c,retriever)

# c=time.time()
# retriever=ChineseBM25Retriever(nodes=new_nodesx,similarity_top_k=10)
# print(time.time()-c,retriever)
retriever.persist("./bm25_retriever")


retrieved_nodes = retriever.retrieve(
    "What is link?"
)
for node in retrieved_nodes:
    print(node)


del retriever
retriever = bm25.BM25Retriever.from_persist_dir("./bm25_retriever")

print("Reload BM25 from disk")
retrieved_nodes = retriever.retrieve(
    "What is link?"
)
for node in retrieved_nodes:
    print(node)


index=VectorStoreIndex(new_nodes,storage_context=storage_context)
# 该处负责存储,需要执行后才能存储 且制定了目录。必须
index.storage_context.persist(persist_dir="./storage")

query_engine=index.as_query_engine(similarity_top_k=3)
ee=query_engine.query("where is Link")
print(ee)

print('Load')

#载入chroma文件中的collection到向量对象
loaded_client=chromadb.PersistentClient(path='./storage/chroma')
loaded_collection=loaded_client.get_collection("My_collection")
#并将对象转唯llamaindex到ChromeVectorStore向量对象
loaded_vector_store=ChromaVectorStore(chroma_collection=loaded_collection)

# 使用StoragContext 载入
loaded_storage_context=StorageContext.from_defaults(
    persist_dir="./storage",
    vector_store=loaded_vector_store
)

#转为可用的index
index=load_index_from_storage(loaded_storage_context)
query_engine=index.as_query_engine(similarity_top_k=3)
ee=query_engine.query("where is Link")
print(ee)
发表在 None | 留下评论