adodbapi orm对象查询(四)

Python例程:使用adodbapi访问MSSQL数据库 今天学习用Python访问数据库,以前用ADO习惯了,所以先找个封装了ADO的模块来试试。adodbapi是用python封装ADO的数据库访问模块,adodbapi接口完全符合Python DB-API2.0规范,简单易用。以下是自己学习过程中写的一个例程,使用了查询、建表、插入数据、执行存储过程等功能,基本上涵盖了日常数据库编程所需的功能。#coding=utf-8import ado 阅读详情

Twisted 项目ORM 最终版本,

没有延迟加载,数据字段映射,简单就是美,查询出来的SQL就是对象直接传输到客户端,引用方便,

而且不会因为对象过大而无法传输到客户端

(开始的时候没有将数据分页保存,而是将ADO的recordset 放到一个对象里面保存,

结果客户端里PB反序列化出来直接是 一个字符串 “too big”类似的,

但是原先我用sqlobject 查询的时候 同样是3000用户却可以返回,

貌似PB对单个对象的大小有所限制,所以我在ResultObj将Recoerdset 分页保存了,

这里暂时没有具体去研究)

这个是项目中实际用到的

# -*- coding: gbk -*-
#!/bin/env python
# Name:         EtSafeFile.py
# Author:       许刚
# Created:      2012/7/20
from common import Ip2Int, LogErr,GBK,PrepareDir
import adodbapi, os
from twisted.spread import pb
from db import Cfg
AvailablePeopleNum=3000
########################################################################
#decorators
def Query(fn):
	"""查询装饰器"""
	def wrapper(*args, **kv):
		conn=connect()
		kv['conn']=conn
		try:
			return fn(*args, **kv)
		except:
			LogErr()
			raise
		finally:
			conn.close()
	return wrapper

def Execute(fn):
	"""增加 删除 修改 装饰器"""
	def wrapper(*args, **kv):
		conn=connect()
		kv['conn']=conn
		try:
			result= fn(*args, **kv)
			conn.commit()
			return result
		except:
			conn.rollback()
			LogErr()
			raise
		finally:
			conn.close()
	return wrapper





#try catch
def Try(fn):
	def wrapper(*args, **kv):
		try:
			return fn(*args, **kv)
		except:
			LogErr()
	return wrapper
########################################################################
#data row
class Row(pb.Copyable):
	def __init__(self,entries): 
		self.__dict__.update(entries)
#tran objects
########################################################################
class ResultObj(pb.Copyable):
	#字符串太长pb无法 传输,转成列表,原理跟FilePager一样
	def __init__(self,rs,PageNo=1,pageSize=300,filedDict=None):
		self.pageSize=pageSize	
		if rs.RecordCount:
			rs.AbsolutePage=PageNo
		self.pageNo=PageNo 
		rs.PageSize=self.pageSize
		self.pageCount=rs.PageCount
		if rs.RecordCount:
			self.rs=rs.GetRows(self.pageSize)
		self.field_num=rs.Fields.Count
		self.next=None
		self.count=self.pageSize

		if self.pageNo<self.pageCount:
			self.next=ResultObj(rs,PageNo+1,self.pageSize,filedDict)
		else:
			self.count=rs.RecordCount-(self.pageNo-1)*self.pageSize
		#查询结果的每一列 生成字典
		if filedDict is None:
			self.filedDict={}
			for n in xrange(self.field_num):
				self.filedDict[n]=rs.Fields.Item(n).Name.lower()
				#没有列明转成 c0 c1.....
				if not self.filedDict[n]:
					self.filedDict[n]='c'+str(n)
		else:
			self.filedDict=filedDict

	def __len__(self):
		return self.count

	def __getitem__(self,key):       	
		row={}
		for cur_col in xrange(self.field_num):
			row[self.filedDict[cur_col]]=self.rs[cur_col][key]
		return Row(row)					
		
	def __iter__(self):
		return iter(self.__next__())
	
	#遍历列表
	def __next__(self):
		fiedlcount=xrange(self.field_num)
		while self:
			for cur_row in xrange(self.count):
				row={}
				for cur_col in fiedlcount:
					row[self.filedDict[cur_col]]=self.rs[cur_col][cur_row]
				yield Row(row)					
			self=self.next
########################################################################
class ResultDict(ResultObj,pb.Copyable):
	def __init__(self,rs,PageNo=1,pageSize=300,filedDict=None):
		ResultObj.__init__(self,rs,PageNo=1,pageSize=300,filedDict=None)	
	def __getitem__(self,key):       	
		row={}
		for cur_col in xrange(self.field_num):
			row[self.filedDict[cur_col]]=self.rs[cur_col][key]
		return row		
	#遍历列表
	def __next__(self):
		fiedlcount=xrange(self.field_num)
		while self:
			for cur_row in xrange(self.count):
				row={}
				for cur_col in fiedlcount:
					row[self.filedDict[cur_col]]=self.rs[cur_col][cur_row]
				yield row					
			self=self.next
########################################################################
class ResultArray(ResultObj,pb.Copyable):
	def __init__(self,rs,PageNo=1,pageSize=300,filedDict=None):
		ResultObj.__init__(self,rs,PageNo=1,pageSize=300,filedDict=None)
	
	def __getitem__(self,key):       	
		row=[]
		for cur_col in xrange(self.field_num):
			row.append(self.rs[cur_col][key])
		return row		
	
	#遍历列表
	def __next__(self):
		fiedlcount=xrange(self.field_num)
		while self:
			for cur_row in xrange(self.count):
				row=[]
				for cur_col in fiedlcount:
					row.append(self.rs[cur_col][cur_row])
				yield tuple(row)					
			self=self.next
########################################################################
class RemoteFile(pb.Copyable):
	def __init__(self,entries): 
		self.__dict__.update(entries)
########################################################################
class Message(pb.Copyable):
	def __init__(self,sender,receiver,fileitem,level):
		self.sender=sender
		self.receiver=receiver
		self.fileitem=fileitem
		self.level=level
		self.option=False
		self.tid=sender.username+receiver.username+fileitem.path
########################################################################
class RemoteMessage(pb.Copyable):
	def __init__(self,entries): 
		self.__dict__.update(entries)

########################################################################
pb.setUnjellyableFactoryForClass('modles.Message',RemoteMessage)
pb.setUnjellyableFactoryForClass('modles.RemoteMessage',RemoteMessage)
pb.setUnjellyableFactoryForClass('modles.File',RemoteFile)
pb.setUnjellyableFactoryForClass('modles.RemoteFile',RemoteFile)	
pb.setUnjellyableFactoryForClass('modles.Row',Row)
########################################################################
#base query fucttion
def queryDict(conn,sql,*args):
	cur=conn.cursor()
	cur.execute(sql,args)
	return ResultDict(cur.rs)
########################################################################
def queryObj(conn,sql,*args):
	cur=conn.cursor()
	cur.execute(sql,args)
	return ResultObj(cur.rs)
########################################################################
def queryArray(conn,sql,*args):
	cur=conn.cursor()
	cur.execute(sql,args)
	return ResultArray(cur.rs)
########################################################################
#conect to db  can use pool here
def connect():
	return adodbapi.connect(Cfg.connectStr)
########################################################################
#where
def where(**kv):
	"""sql 条件拼接"""
	sqlkeys=''
	sqlparams=[]
	for colum in kv.keys():
		sqlkeys+= ' and ' if sqlkeys else ' where '
		param=GBK(kv[colum])
		if colum.endswith('_gt'):
			exp=colum.replace('_gt',' > ')+'?'
			sqlparams.append(param)
		elif colum.endswith('_lt'):
			exp=colum.replace('_lt',' < ')+'?'
			sqlparams.append(param)
		elif colum.endswith('_ge'):
			exp=colum.replace('_ge',' >= ')+'?'
			sqlparams.append(param)
		elif colum.endswith('_le'):
			exp=colum.replace('_le',' <= ')+'?'
			sqlparams.append(param)
		elif colum.endswith('_like'):
			exp=colum.replace('_like',' like ')+'?'
			sqlparams.append(param)
		elif colum.endswith('_in'):
			assert len(param)>0
			exp=colum.replace('_in',' in ')
			exp+='('+','.join('?'*len(param))+')'
			sqlparams+=param
		elif colum.endswith('_ne'):
			#not equal
			exp=colum.replace('_ne',' != ')+'?'
			sqlparams.append(param)
		else:
			exp=colum+'= ? '
			sqlparams.append(param)
		sqlkeys+=exp
	return sqlkeys,sqlparams

##select
#not  suggest to use
def select(conn,tables,colums='*',**kv):
	sql='select '+colums+' from '+tables
	keys,params=where(**kv)
	sql+=keys
	return queryObj(conn,sql,*params)




#insert
def insert(conn,table,**kv):
	""" eg: insert(conn,'test',id=2,name=5) sql:insert inot test(id,name) values(2,5)"""
	sqlcolums=[]
	sqlparams=[]
	for k,v in kv.items():
		sqlcolums.append(k)
		sqlparams.append(GBK(v))
	sqlparams=tuple(sqlparams)
	sql=' insert into '+table+' ('+','.join(sqlcolums)+') '+' values ('+','.join('?'*len(sqlcolums))+') '

	cur=conn.cursor()
	cur.execute(sql,sqlparams)




#update
def update(conn,table,where,**kv):
	"""eg: update(conn,'test',id=2,name=5) sql update test set id=2,name=5"""
	sqlcolums=[]
	sqlparams=[]
	for k,v in kv.items():
		sqlcolums.append(k)
		sqlparams.append(GBK(v))
	sql=' update '+table+' set '+','.join([p+'=?' for p in sqlcolums])
	if where:
		where_sql,where_sqlparams=where
		sqlparams+=where_sqlparams
		sql+=where_sql
	print sql
	cur=conn.cursor()
	cur.execute(sql,sqlparams)

#delete 
def delete(conn,table,**kv):
	"""删除"""
	where_sql,sqlparams=where(**kv)
	sql=' delete from '+table + where_sql
	cur=conn.cursor()
	cur.execute(sql,sqlparams)

########################################################################
#proc and function
@Execute
def  procLogin(name,pwd,ip,mac,conn=None):
	cur=conn.cursor()
	uid,val,remark,opResult=0,0,'',''
	param=(name,pwd, AvailablePeopleNum,mac, Ip2Int(ip), ip,False,uid,val,remark,opResult)
	param=cur.callproc('Proc_login',param)
	uid,val,remark,opResult=param[-4],param[-3],param[-2],param[-1]
	user=None
	if val==2:user=findUserByID(conn,uid)
	return user,remark

def procFindAvailableUser(conn,uid):
	"""查询当前可用的用户"""
	return queryObj(conn,"EXEC dbo.Find_Available_Users @UID = ? ",uid)

def funcNeedApprove(conn,fromUid,toUid,types):
	arr= queryArray(conn,'SELECT dbo.NeedApprove(?,?,?)',fromUid,toUid,types)
	if len(arr):return arr[0][0]
########################################################################





########################################################################

########################################################################



if __name__=='__main__':
	@Execute
	def TestUpdate(conn=None):
		update(conn, 'Users',where(uid=0),pwd='123')
	@Query
	def TestQuery(conn=None):
		unitshare = queryObj(conn, 'SELECT  ID,DirName Name,UtID,Note FROM dbo.Doc_UnitFolder')
		print unitshare.dirname


	@Execute
	def TestDelete(conn=None):
		delete(conn,'Doc_OffLineMessage', uid=0, messageid=1)



	TestUpdate()

#7-28 更新where 添加or 支持

添加connection with支持


class Conner:
	def __init__(self):
		self.conn=connect()

	def __enter__(self):
		return self.conn

	def __exit__(self, type, value, traceback):
		if type and value and traceback:
			LogErr()
		self.conn.close()




class Executer:
	def __init__(self):
		self.conn=connect()

	def __enter__(self):
		return self.conn

	def __exit__(self, type, value, traceback):
		if type and value and traceback:
			LogErr()
			self.conn.rollback()
		else:
			self.conn.commit()
		self.conn.close()


#where
def where(**kv):
	"""sql 条件拼接"""
	sqlkeys=''
	sqlparams=[]
	for colum in kv.keys():
		param=GBK(kv[colum])
		if colum.startswith('or_'):
			colum=colum.lstrip ('or_').lstrip('_')
			sqlkeys+= ' or ' if sqlkeys else ' where '
		else:
			sqlkeys+= ' and ' if sqlkeys else ' where '

		if colum.endswith('_gt'):
			exp=colum.replace('_gt',' > ')+'?'
			sqlparams.append(param)
		elif colum.endswith('_lt'):
			exp=colum.replace('_lt',' < ')+'?'
			sqlparams.append(param)
		elif colum.endswith('_ge'):
			exp=colum.replace('_ge',' >= ')+'?'
			sqlparams.append(param)
		elif colum.endswith('_le'):
			exp=colum.replace('_le',' <= ')+'?'
			sqlparams.append(param)
		elif colum.endswith('_like'):
			exp=colum.replace('_like',' like ')+'?'
			sqlparams.append(param)
		elif colum.endswith('_in'):
			assert len(param)>0
			exp=colum.replace('_in',' in ')
			exp+='('+','.join('?'*len(param))+')'
			sqlparams+=param
		elif colum.endswith('_ne'):
			#not equal
			exp=colum.replace('_ne',' != ')+'?'
			sqlparams.append(param)
		else:
			exp=colum+'= ? '
			sqlparams.append(param)
		sqlkeys+=exp
	return sqlkeys,sqlparams

Test

if __name__=='__main__':

	def TestUpdate(conn=None):
		update(conn, 'Users',where(or_uid=0,or__uid=-1),pwd='123')

	@Query
	def TestQuery(conn=None):
		unitshare = queryObj(conn, 'SELECT  ID,DirName Name,UtID,Note FROM dbo.Doc_UnitFolder')
		print unitshare.dirname


	@Execute
	def TestDelete(conn=None):
		delete(conn,'Doc_OffLineMessage', uid=0, messageid=1)




	with Executer() as conn:
		update(conn, 'Users',where(or_uid=0,or__uid=-1),pwd='123')


CAB单片机开发指南 CAB单片机开发使用指南,IDE安装及烧录注意事项 阅读详情

相关推荐

VSCode配置ClangFormat:让C++大括号乖乖不换行(附常见样式对比)

本文详细介绍了如何在VSCode中配置ClangFormat,实现C++代码大括号不换行的格式化风格。通过对比Attach、Allman等主流大括号样式,并提供从快速设置到项目级配置的完整指南,帮助开发者打造统一、高效的代码格式化工作流,提升团队协作效率。

weixin_28835551的博客 215

Python例程:使用adodbapi存取二进制数据

昨天尝试了adodbapi的常用操作,今天写一个存取二进制图片的程序试试,ado里面存取二进制数据还是要稍复杂点,不知道adodbapi表现又怎么样。例程功能:1. 新建一个测试表,用于存储图片数据2. 读取源图片数据,插入一条记录到测试表3. 读取新插入的表记录,将二进制字段数据写入到目标文件4. 直接打开目标图片文件,看看内容是否与源图片一致  1#codi

iLdf的专栏 1906

LLM Wiki 的完整输入体系:LLM Wiki极简实战

LLM Wiki 的输入分为**四大类**,覆盖从"原始知识注入"到"系统行为控制"的全流程,所有输入都遵循"**原始资料不可变,规则可迭代,人类反馈闭环**"的核心原则。

ZhangJiqun&191cm&85kg 316

Python Twisted介绍

原文链接:http://www.aosabook.org/en/twisted.html 作者:Jessica McKellar Twisted是用Python实现的基于事件驱动的网络引擎框架。Twisted诞生于2000年初,在当时的网络游戏开发者看来,无论他们使用哪种语言,手中都鲜有可兼顾扩展性及跨平台的网络库。Twisted的作者试图在当时现有的环境下开发游戏,这一步走的非常...

weixin_30381793的博客 1614

SAP Cloud ERP 是什么,一篇文章讲清楚

SAP Cloud ERP并非简单将传统ERP搬到云上,而是对企业核心流程、数据和管理方式的全面重构。它包含S/4HANA Cloud的公有云版(标准化、快速部署)和私有云版(灵活定制),分别对应GROW with SAP和RISE with SAP实施路径。核心价值在于实现实时数据整合、端到端流程贯通及持续演进能力。企业需根据发展阶段选择:新兴企业适合标准化公有云,复杂组织可考虑私有云迁移。关键在于转变管理思维,避免将旧系统问题复制到新平台。上云决策本质是企业对数字化基座的选择,需权衡标准化与个性化需求。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 107

时频分析之短时傅里叶变换(STFT)

本文利用MATLAB自带的spectrogram函数对信号做短时傅里叶变换。首先介绍了短时傅里叶变换(STFT)的背景及意义;其次,对spectrogram函数的用法以及变量的含义做了详细的解释;最后,利用MATLAB编写程序实现了信号的STFT。

总结论文中的算法并给出论文的复现代码 7万+

adodbapi orm对象查询(二)

转载注明出处 http://blog.youkuaiyun.com/xugangjava/article/details/7565420 接上篇,实现SQL关键字,以前搞java这些经常是数据库改了一个字段, 先改数据库,然后改SQL,还要改Javabean,最后还要去改前台页面 实现下面这些函数将会是代码更加简化 #where def where(**kv): keys='' param

xugangjava的专栏 999

【知识分享】IBIS 建模指南 05

本文详细阐述了IBIS模型创建过程中的关键技术和数据规范要求。主要内容包括:1. 数据完整性检查要点,强调I-V和V-T数据必须覆盖所有工艺角且匹配;2. 数据限制处理方法,介绍100/1000点限制下的两种数据筛选算法;3. 特殊数据处理技术,包括内部终端电阻调整和V-T表时间窗口选择;4. 高级关键字应用,涵盖[ModelSelector]、[Sub model]、[DiffPin]等复杂功能实现方法;5. 预加重缓冲器等特殊结构的建模方案。

一只豌豆象的博客 1591

Scrapy用Twisted异步操作Mysql

1首先在setting中配置好数据库的信息,便于修改管理MYSQL_HOST='192.168.0.2'#主机 MYSQL_DBNAME='dbname'#数据库名称 MYSQL_USER='root'#用户名 MYSQL_PASSWORD='jian'#密码在pipelines.py中# Twisted只是提供一个异步容器,本身没提供数据库链接 class MysqlTwistedPipeline

简国堂的博客 4147

FastAPI 高级特性:同异步路由函数、依赖注入与后台任务

在现代 Web 开发中,高效的性能和简洁的代码结构是至关重要的。FastAPI 作为一个现代、快速(高性能)的 Web 框架,凭借其对异步编程的原生支持和直观的依赖注入系统,迅速成为开发者的热门选择。在本文中,将深入探讨 `FastAPI` 中的几个核心概念:同异步函数的区别、`Depends` 依赖以及后台任务。

qq_43629857的博客 203

人群仿真软件:Pathfinder_(14).与其他软件的集成与互操作

在人群仿真软件的二次开发中,与其他软件的集成和互操作是非常重要的。通过数据导入导出、接口调用和脚本编写,可以显著提升仿真的准确性和实用性。Pathfinder提供了多种数据格式的支持和丰富的API,使得与其他软件的集成变得简单高效。无论是建筑模型的导入、仿真结果的导出,还是实时数据的交换,Pathfinder都能满足用户的需求。

kkchenjj的博客 1015

adodbapi orm对象查询(一)

转载注明出处 http://blog.youkuaiyun.com/xugangjava/article/details/7565321 由于项目中需要用到adodbapi,看过一些orm感觉和twisted的 PB兼容性都不是很好, 主要问题是,PB的 Jelly模块无法解析orm内部的一些类型,只有自己造轮子,写个简易的ORM,来简化代码 (最近时间比较紧,有不对的地方欢迎大家拍砖) 1.ad

xugangjava的专栏 1151

YOLOv11改进策略【Neck】| PRCV 2023,SBA(Selective Boundary Aggregation):特征融合模块,描绘物体轮廓重新校准物体位置,解决边界模糊问题

SBA 模块在医疗图像分割中具有重要作用,其设计出发点是解决图像中物体边界模糊以及融合特征时的冗余和不一致问题。

Limiiiing的博客 1942

adodbapi orm对象查询(三)

转载注明出处 http://blog.youkuaiyun.com/xugangjava/article/details/7565420 接上篇,写两个适配器一个用于查询Query,一个用于Execute ######################################################################## #decorators def Query(fn

xugangjava的专栏 839

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

SqlAlchemy 2.0 中文文档(六十三)

原文:docs.sqlalchemy.org/en/20/contents.html 1.0 变更日志 原文:docs.sqlalchemy.org/en/20/changelog/changelog_10.html 1.0.19 发布日期:2017 年 8 月 3 日 oracle [oracle] [performance] [bug] [py2k] 修复了由于修复了#3937引起的性能回退,其中 cx_Oracle 在 5.3 版本中从其命名空间中删除了.UNICODE符号,这被解释为 c

龙哥盟 1697

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

使用Python操作MSSQL数据库.

有时想更新或迁移部分SqlServer数据,用SQL只会整几句select,高级点的连个游标都玩不转有木有?拿起VS写个小程序不停的改又编译很烦,有木有? 想用脚本写了有木有? 本文介绍使用python,adodbapi操作数据库: adodbapi 库 python 可以操作mssqlserver的类库有几个,支持python3.x的目前没几个靠谱的.adodbapi是使用ADO...

weixin_30347335的博客 229

Twisted开发Web应用笔记

(最近忙,发点旧文凑数-_-|||,这是三月份试用Twisted时记的一点笔记) Twisted是一个功能极为强大的异步网络应用开发库——当然是Python的。印象中大概也就只有ACE有这么强悍,但Twisted在易用性方面要好很多——这其中当然少不了Python的功劳(ACE是用C++的)。 但Python也有其缺点,其中之一就是因为GIL的存在使得用Python写多线程应用的意

猛禽的编程艺术 1万+

deferred Transports Protocols 简单介绍

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33842304的博客 311

python调用C# Com 的dll

dll源程序 可查看 文章> http://blog.youkuaiyun.com/xugangjava/article/details/7067413 首先 运行 工具 makepy.py 这样就可以查看 C# dll的 com导出的 py文件了 查看 # -*- coding: mbcs -*- # Created by makepy.py version 0.5.0

xugangjava的专栏 1万+

wxPython实现仿QQ登录界面

蛋疼 ,全部自己画 下面主要是按钮的实现,绑定键盘鼠标事件 当UP的时候 发送EVT_BUTTON 消息,比较难得就是实现面板默认按钮 在输入框的时候,点击回车 发送按钮实现 这里用Panel BIND EVT_CHAR_HOOK来实现,得到EVT_CHAR_HOOK时发生按钮点击事件 class AbstractButton(wx.Window): def __init__(self

xugangjava的专栏 9104

Python FTP遍历删除文件夹

转载请注明出处 http://blog.youkuaiyun.com/xugangjava/article/details/7401906 总体思路是:使用递归来 遍历文件 和文件夹  遍历过程中 直接删除掉 文件 将文件夹路径添加到列表中 yield 操作是在  for 递归遍历子文件夹 之后 所以先返回的是子文件夹  这时返回的文件夹肯定是空文件夹 ,使用rm命令就可以直接删除掉文件夹了

xugangjava的专栏 8864

wxpython 封装listctrl 支持添加控件

http://blog.youkuaiyun.com/xugangjava/article/details/7951605 #now not use class AbstractList(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin, listmix.ColumnSorterMixin): def __init__(self, parent,columes

xugangjava的专栏 7071

Python 实现简单的C/S在线更新程序

使用urllib 直接下载html 服务端 Respones把 安装包msi 的二进制流 输出,客户端判断下载下来的文件大小, 一般很小 就有可能是404等信息,只需判断文件大小来决定是否运行更新程序即可 如果为空则输出版本号,放到一个后台线程中运行 就OK了,只用更新服务端文件, 客户端登录自动安装更新,部分代码 class UpdateTimer(threading.Thread

xugangjava的专栏 6772

Py2exe 打包后图标不显示

下载Png2Ico  http://www.winterdrache.de/freeware/png2ico/ 编辑图标大小准备 248*248 128*128 64*64 48*48 32*32 16*16的图标 命令下执行 Png2Icon.exe Attach.ico logo248.png logo128.png,logo64.png logo48.png logo32.png

xugangjava的专栏 6346
上一篇: wxpython skin sharp的问题
下一篇: wxpython skin bug(弹出菜单,内存错误)
xugangjava
博客等级 码龄16年 83粉丝 72原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值