python例程:《企业编码生成系统》程序
目录
- 《企业编码生成系统》程序使用说明
- 主要代码演示
- 源码及说明文档下载路径
《企业编码生成系统》程序使用说明
在PyCharm中运行《企业编码生成系统》即可进入如图1所示的系统主界面。在该界面中可以选择要使用功能对应的菜单进行不同的操作。在选择功能菜单时,只需要输入对应的数字即可。
图1 系统主界面
具体的操作步骤如下:
(1)生成6位数字防伪编码。当用户在主程序界面中输入数字“1”菜单项时,将进入“生成6位数字防伪编码 (213563型)”的功能执行任务。此时要求输入生成防伪码的数量,可以根据需要输入生成防伪码的数量,如图2所示。按下键,开始批量生成防伪码,生成后系统将提示用户生成了多少个注册码和生成文件的位置信息等,如图3所示。单击“确定”按钮,关闭提示信息。在屏幕上可以看到生成的防伪码信息,如图4所示。生成的文件在程序所在目录下的“codepath”文件夹下,名称为“scode1.txt”,如图5所示。
图2 输入操作菜单和生成防伪码数量
图3 提示生成防伪码数量和路径信息
图4 屏幕输出的防伪码信息
图5 生成的防伪码文件
(2)生成9位系列产品数字防伪编码。在主程序界面中输入数字“2”菜单项时,将进入“生成9位系列产品数字防伪编码”的功能执行。在产品系列其实编码输入中输入235,在系列产品数量中输入5,在每个系列生成数量中输入10000,如图6所示,按下键,开始生成防伪码。生成后系统将提示用户生成防伪码信息,如图7所示。同时弹出如图8所示的提示对话框,单击“确定”按钮,关闭提示对话框。
图6 输入系列数据
图7 生成9位数字防伪码
图8 提示防伪码生成
(3)生成25位混合产品序列号。在主程序界面中输入数字“3”菜单项时,将进入“生成25位混合产品序列码”的功能执行。在输入要生成的数量中输入30000,如图9所示,并且按下键,将生成30000个如图10所示的25位防伪码。生成的文件名称如图11所示。
图9 生成25位混合产品序列码
图10 生成25位混合产品序列码
图11 25位混合产品序列码保存文件
(4)生成含数据分析功能的防伪编码。在主程序界面中输入数字“4”菜单项时,将进入“生成含数据分析功能的防伪编码”的功能执行。在输入要生成的带数据分析功能的验证码数量中输入300,并且按下键;在输入数据分析编号(3位字母)中输入ABS,并按下键,将生成30000个如图9所示的25位防伪码,如图12所示。
图12 生成含数据分析功能的防伪编码
(5)智能批量生成带数据分析功能的防伪码。当用户在功能选择界面中输入数字“5”时,进入智能批量生成带数据分析功能的防伪码功能选项,在弹出的对话框中,选择保存批量生成防伪码信息的文件(扩展名为.mri的文件,文件内容如图13所示,其中前面的3位字母是数据分析码,后面的数值是防伪码的个数),如图14所示,单击“打开”按钮,将批量生成防伪码信息,并把不同类别的防伪码文件保存在不同的文件中,如图15所示。
图13 保存批量生成防伪码信息的文件内容
图14 打开防伪码批量数据文件
图15 批量生成的防伪码文件
(6)后续补加生成防伪码。在功能选择界面中输入数字“6”时,将进入补充防伪码生成功能选项。首先在打开的对话框中选择已经生成的防伪码的文件(需要使用前4步中生成的防伪码文件),如图16所示。系统将自动分析已经生成的防伪码数量,并给出提示对话框,如图17所示。接下来要求用户输入补充防伪码的数量,根据要求的防伪码数量循环生成新防伪码,如图18所示。完成后将提醒防伪码已经完成,并提示新生成的防伪码文件的保存位置,如图19所示。
图16 选择已经生成的防伪码文件
图17 提示已经存在的防伪码数量
图18 生成补充防伪码
图19 提示防伪码补充生成完成
(7)EAN-13条形码批量生成。在功能选择界面中输入数字“7”时,将进入EAN-13条形码批量生成功能选项。在请输入EN13的国家代码(3位)中输入692;在请输入EAN13的企业代码(4位)中输入1000;在请输入要生成的条形码数量中输入条形码的数量,这里输入2,并按下键,将自动生成条形码,如图20所示。生成后的文件保存在项目根目录下的barcode目录中,效果如图21所示。
图20 生成条形码
图21 生成后的条形码
(8)二维码批量输出。在功能选择界面中输入数字“8”时,将进入二维码批量输出功能选项。在请输入要生成的12位数字二维码数量中输入二维码的数量,这里输入5,并按下键,将自动生成二维码,如图22所示。生成后的文件保存在项目根目录下的barcode目录中,效果如图23所示。
图22 生成条形码
图23 生成后的条形码
(9)企业粉丝防伪码抽奖。在功能选择界面中输入数字“9”时,将进入企业粉丝防伪码抽奖功能选项。将弹出文件选择对话框,如图2.52所示。选择抽奖信息文件后,输入抽取中奖用户数量,如图24所示,并且按下键,将显示抽取的中奖号码,如图25所示。
图23 文件选择对话框
图24 输入抽取中奖用户数量
图25 显示抽取的中奖号码
(10)退出系统。在功能选择界面中输入数字“0”,并且按下键即可退出系统,如图26所示。
图26 退出系统
主要代码演示
import os
import qrcode
import random
import time
import tkinter
from pystrich.ean13 import EAN13Encoder
import tkinter.filedialog
import tkinter.messagebox
from string import digitsroot = tkinter.Tk() # tkinter模4
# 块为python的标准图形界面接口。本代码的目的是建立根窗口
# 初始化数据
number = "1234567890"
letter = "ABCDEFGHIJKLMNPQRSTUVWXYZ1234567890"
allis = "1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz!@#$%^&*()_+"
i = 0randstr = []
fourth = []
fifth = []
randfir = ""
randsec = ""
randthr = ""
str_one = ""
strone = ""
strtwo = ""
nextcard = ""
userput = ""
nres_letter = ""# 创建文件夹函数
def mkdir(path):isexists = os.path.exists(path) # 判断文件夹路径是否存在if not isexists: # 如果文件夹路径不存在os.mkdir(path) # 创建要创建的文件夹# 读取文件内容函数
def openfile(filename):f = open(filename) # 打开指定文件fllist = f.read() # 读取文件内容f.close() # 关闭文件return fllist # 返回读取的文件内容# 输入验证函数,showstr为input函数提供动态输入提示文字,showorder提供验证方式,length提供要求输入数据的长度
def inputbox(showstr,showorder,length):instr = input(showstr) # 使用input函数要求用户输入信息,showstr为输入提示文字if len(instr) != 0: # 输入数据的长度不为零# 根据输入数据的要求,分成三种验证方式验证,1:数字,不限位数;2:字母;3:数字且有位数要求if showorder == 1: # 验证方式 ,数字格式,不限位数,大于零的整数if str.isdigit(instr): # 验证是否为数字if instr == 0: # 验证数字是否为0,如果是,要求重新输入,返回值为0print("\033[1;31;40m 输入为零,请重新输入!!\033[0m") # 要求重新输入,返回值为“0”return "0" # 函数返回值为“0”,为什么返回值为“0”呢?读者思考一下else: # 如果输入正确,返回输入的数据给返回值return instr #将输入的数据传给函数返回值else: # 如果输入不是数字,要求用户重新输入,函数返回值为“0”print("\033[1;31;40m输入非法,请重新输入!!\033[0m") # 要求用户重新输入return "0" # 函数返回值为“0”if showorder == 2: # 验证方式2 ,要求字母格式,且是三个字母if str.isalpha(instr): # 判断输入是否为字母if len(instr) != length: # 判断输入的是否为三个字母,如果不是,则要求重新输入,返回值为“0”print("\033[1;31;40m必须输入三个字母,请重新输入!!\033[0m") # 要求重新输入return "0" # 返回值为“0”else: # 如果输入是三个字母,返回输入的字母return instr # 将函数返回值设置为输入的字母else: # 如果输入不是字母print("\033[1;31;40m输入非法,请重新输入!!\033[0m") # 要求重新输入return "0" # 返回值为“0”if showorder == 3: # 验证方式3 ,要求数字格式,且输入数字位数有要求if str.isdigit(instr): # 验证是否为数字if len(instr) != length: # 验证输入数字是否为要求长度位数,如果不是3位数字,则要求重新输入print("\033[1;31;40m必须输入" + str(length) + "个数字,请重新输入!!\033[0m") # 要求重新输入return "0" # 返回值为“0”else: # 输入数字满足要求,设置函数返回值为输入信息return instr #设置函数返回值为输入信息else: # 如果输入不是数字print("\033[1;31;40m输入非法,请重新输入!!\033[0m") # 提示输入非法,要求重新输入return "0" # 函数返回值为“0”else: # 如果没有输入任何内容,即输入为空print("\033[1;31;40m输入为空,请重新输入!!\033[0m") # 提示输入为空,要求重新输入return "0" # 函数返回值为“0”# 实现屏幕输出和文件输出编码信息函数,# sstr参数为输出防伪码数据, sfile为输出的文件名称
# typeis设置输出完成后是否通过信息框提示, smsg为信息提示框的提示文字,datapath 保存防伪码的文件夹
def wfile(sstr, sfile, typeis, smsg,datapath):mkdir(datapath) # 调用该函数创建文件夹datafile = datapath + "\\" + sfile # 设置保存防伪码的文件(包含路径)file = open(datafile, 'w') # 打开保存防伪码的文件,如果文件不存在,则创建该文件wrlist = sstr # 将防伪码信息赋值给wrlistpdata = "" # 清空变量pdata,pdata存储屏幕输出的防伪码信息wdata = "" # 清空变量 wdata , wdata 存储保存到文本文件的防伪码信息for i in range(len(wrlist)): # 按条循环读取防伪码数据wdata = str(wrlist[i].replace('[', '')).replace(']', '') # 去掉字符的中括号wdata = wdata.replace(''''','').replace(''''', '') # 去掉字符的引号file.write(str(wdata)) # 写入保存防伪码的文件pdata = pdata + wdata # 将单条防伪码存储到pdata 变量file.close() # 关闭文件print("\033[1;31m" + pdata + "\033[0m") # 屏幕输出生成的防伪码信息if typeis != "no": # 是否显示“输出完成”的信息提示框。如果typeis的值为“no”,不现显示# 显示“输出完成”的信息提示框。显示信息包含方位信息码的保存路径tkinter.messagebox.showinfo("提示", smsg + str(len(randstr)) + "\n 防伪码文件存放位置:" + datafile)root.withdraw() # 关闭辅助窗口# 实现屏幕输出和文件输出编码信息,参数schoice设置输出的文件名称def scode1( schoice):# 调用inputbox函数对输入数据进行非空、输入合法性判断incount = inputbox("\033[1;32m 请输入您要生成验证码的数量:\33[0m", 1, 0)while int(incount) == 0: # 如果输入为字母或数字0,则要求重新输入incount = inputbox("\033[1;32m 请输入您要生成验证码的数量:\33[0m", 1, 0)randstr.clear() # 清空保存批量注册码信息的变量randstrfor j in range(int(incount)): # 根据输入的验证码数量循环批量生成注册码randfir = '' # 设置存储单条注册码的变量为空for i in range(6): # 循环生成单条注册码randfir = randfir + random.choice(number) # 产生数字随机因子 randfir = randfir + "\n" # 在单条注册码后面添加转义换行字符“\n”,使验证码单条列显示 randstr.append(randfir) # 将单条注册码添加到保存批量验证码的变量randstr #调用函数wfile(),实现生成的防伪码屏幕输出和文件输出wfile(randstr,"scode" + str(schoice) + ".txt", "", "已生成6位防伪码共计:","codepath")# 生成9位系列产品数字防伪编码函数,参数schoice设置输出的文件名称
def scode2(schoice):ordstart = inputbox("\033[1;32m 请输入系列产品的数字起始号(3位):\33[0m", 3, 3)while int(ordstart) == 0: # 如果输入非法(符号、字母或者数字0都认为是非法输入),重新输入ordstart = inputbox("\033[1;32m 请输入系列产品的数字起始号(3位):\33[0m", 3, 3)ordcount = inputbox("\033[1;32m 请输入产品系列的数量:", 1, 0)# 如果输入的产品系列数量小于1或者大于9999,,则要求重新输入while int(ordcount) < 1 or int(ordcount) > 9999:ordcount = inputbox("\033[1;32m 请输入产品系列的数量:", 1, 0)incount = inputbox("\033[1;32m 请输入要生成的每个系列产品的防伪码数量:\33[0m", 1, 0)while int(incount) == 0: # 如果输入为字母或数字0,则要求重新输入incount = inputbox("\033[1;32m 请输入您要生成验证码的数量:\33[0m", 1, 0)randstr.clear() # 清空保存批量注册码信息的变量randstrfor m in range(int(ordcount)): # 分类产品编号for j in range(int(incount)): # 产品防伪码编号randfir = ''for i in range(6): # 生成一个不包含类别的产品防伪码randfir = randfir + random.choice(number) # 每次生成一个随机因子randstr.append(str(int(ordstart) + m) + randfir + "\n") # 将生成的单条防伪码添加到防伪码列表#调用函数wfile(),实现生成的防伪码屏幕输出和文件输出wfile(randstr, "scode" + str(schoice) + ".txt", "", "已生成9位系列产品防伪码共计:","codepath")# 生成25位混合产品序列号函数,参数schoice设置输出的文件名称
def scode3(schoice):# 输入要生成的防伪码数量incount = inputbox("\033[1;32m 请输入要生成的25位混合产品序列号数量:\33[0m", 1, 0)while int(incount) == 0: # 如果输入非法(符号、字母或者数字0都认为是非法输入),重新输入incount = inputbox("\033[1;32m 请输入要生成的25位混合产品序列号数量:\33[0m", 1, 0)randstr.clear() # 清空保存批量注册码信息的变量randstrfor j in range(int(incount)): # 按输入数量生成防伪码strone = '' # 保存生成的单条防伪码,不带横线“-”,循环时清空for i in range(25):strone = strone + random.choice(letter) #每次产生一个随机因子,也就是每次产生单条防伪码的一位# 将生成的防伪码每隔5位添加横线“-”strtwo = strone[:5] + "-" + strone[5:10] + "-" + strone[10:15] + "-" + strone[15:20] + "-" + strone[20:25] + "\n"randstr.append(strtwo) # 添加防伪码到防伪码列表#调用函数wfile(),实现生成的防伪码屏幕输出和文件输出wfile(randstr, "scode" + str(schoice) + ".txt", "", "已生成25混合防伪序列码共计:","codepath")# 生成含数据分析功能防伪编码函数,参数schoice设置输出的文件名称
def scode4(schoice):intype = inputbox("\033[1;32m 请输入数据分析编号(3位字母):\33[0m", 2, 3)# 验证输入是否是三个字母,所以要判断输入是否是字母和输入长度是否为3while not str.isalpha(intype) or len(intype) != 3:intype = inputbox("\033[1;32m 请输入数据分析编号(3位字母):\33[0m", 2, 3)incount = inputbox("\033[1;32m 请输入要生成的带数据分析功能的验证码数量:\33[0m", 1, 0) ## 验证输入是否是大于零的整数,判断输入转换为整数值时是否大于零while int(incount) == 0: # 如果转换为整数时为零,则要求重新输入incount = inputbox("\033[1;32m 请输入要生成的带数据分析功能的验证码数量:\33[0m", 1, 0) #ffcode(incount,intype,"",schoice) # 调用 ffcode函数生成注册信息# 生成含数据分析功能防伪编码函数,参数scount为要生成的防伪码数量,typestr为数据分析字符
# 参数ismessage在输出完成时是否显示提示信息,为“no”不显示,为其他值显示;参数schoice设置输出的文件名称
def ffcode(scount, typestr,ismessage, schoice):randstr.clear() # 清空保存批量注册码信息的变量randstr# 按数量生成含数据分析功能注册码for j in range(int(scount)):strpro = typestr[0].upper() # 取得三个字母中的第一个字母,并转为大写,区域分析码strtype = typestr[1].upper() # 取得三个字母中的第二个字母,并转为大写,颜色分析码strclass = typestr[2].upper() # 取得三个字母中的第三个字母,并转为大写,版本分析码randfir = random.sample(number, 3) # 随机抽取防伪码中的三个位置,不分先后randsec = sorted(randfir) # 对抽取的位置进行排序并存储给randsec变量,以便按顺序排列三个字母的位置letterone = "" # 清空存储单条防伪码的变量letteronefor i in range(9): # 生成9位的数字防伪码letterone = letterone + random.choice(number)# 将三个字母按randsec变量中存储的位置值添加到数字防伪码中,并放到sim变量中sim = str(letterone[0:int(randsec[0])]) + strpro + str(letterone[int(randsec[0]):int(randsec[1])]) + strtype + str(letterone[int(randsec[1]):int(randsec[2])]) + strclass + str(letterone[int(randsec[2]):9]) + "\n"randstr.append(sim) # 将组合生成的新防伪码添加到randstr变量# 调用wfile()函数,实现生成的防伪码屏幕输出和文件输出wfile(randstr, typestr + "scode" + str(schoice) + ".txt", ismessage, "生成含数据分析防伪码共计:","codepath")# 生成含数据分析功能防伪编码函数,参数schoice设置输出的文件名称
def scode5(schoice):default_dir = r"mrsoft.mri" # 设置默认打开的文件名称# 打开文件选择对话框,指定打开的文件名称为"mrsoft.mri" ,扩展名为“mri”,可以使用记事本打开和编辑file_path = tkinter.filedialog.askopenfilename(filetypes=[("Text file","*.mri")],title=u"请选择自动防伪码智能批处理文件:",initialdir=(os.path.expanduser(default_dir)))codelist = openfile(file_path) # 读取从文件选择对话框选中的文件print("前:",codelist)codelist = codelist.split("\n") # 把读取的信息内容添加回车,以便列输出显示print("后:",codelist)for item in codelist: # 按读取的信息循环生成防伪码codea = item.split(",")[0] # 每一行信息中用 ","分割,","前面的信息存储防伪码标准信息codeb = item.split(",")[1] # 每一行信息中用 ","分割,","后面的信息存储防伪码生成的数量ffcode(codeb, codea,"no" ,schoice) # 调用ffcode函数批量生成同一标识信息的防伪码# 后续补加生成防伪码函数,防伪码格式为带数据分析功能注册码
def scode6(schoice):default_dir = r"c:\ABDscode5.txt" # 设置默认打开的文件名称# 按默认的文件名称打开文件选择对话框,用于打开已经存在的防伪码文件file_path = tkinter.filedialog.askopenfilename(title=u"请选择已经生成的防伪码文件",initialdir=(os.path.expanduser(default_dir)))codelist = openfile(file_path) # 读取从文件选择对话框选中的文件codelist = codelist.split("\n") # 把读取的信息内容添加回车,以便列输出显示codelist.remove("") # 删除列表中的空行strset = codelist[0] # 读取一行数据,以便获取原验证码的字母标志信息remove_digits = strset.maketrans("", "", digits) # 用maketrans方法创建删除数字的字符映射转换表res_letter = strset.translate(remove_digits) # 根据字符映射转换表删除该条防伪码中的数字,获取字母标识信息nres_letter = list(res_letter) # 把信息用列表变量nres_letter存储strpro = nres_letter[0] # 从列表变量中取得第一个字母,即区域分析码strtype = nres_letter[1] # 从列表变量中取得第二个字母,即色彩分析码strclass = nres_letter[2] # 从列表变量中取得第三个字母,即版次分析码# 去除信息中的括号和引号nres_letter = strpro.replace(''''','').replace(''''', '') + strtype.replace(''''','').replace(''''', '') + strclass.replace(''''','').replace(''''', '')print("sssssssssss",nres_letter)card = set(codelist) # 将原有防伪码放到集合变量card中# 利用tkinter的messagebox提示用户之前生成的防伪码数量tkinter.messagebox.showinfo("提示", "之前的防伪码共计:" + str(len(card)))root.withdraw() # 关闭提示信息框incount = inputbox("请输入补充验证码生成的数量:", 1, 0) # 让用户输入新补充生成的防伪码数量# 最大值按输入生成数量的2倍数量生成新防伪码,防止新生成防伪码与原有防伪码重复造成新生成的防伪码数量不够,for j in range(int(incount) * 2):randfir = random.sample(number, 3) # 随机产生3位不重复的数字randsec = sorted(randfir) #对产生的数字排序addcount = len(card) # 记录集合中防伪码的总数量strone = "" # 清空存储单条防伪码的变量stronefor i in range(9): # 生成9位的数字防伪码strone = strone + random.choice(number)# 将三个字母按randsec变量中存储的位置值添加到数字防伪码中,并放到sim变量中sim = str(strone[0:int(randsec[0])]) + strpro + str(strone[int(randsec[0]):int(randsec[1])]) + strtype + str(strone[int(randsec[1]):int(randsec[2])]) + strclass + str(strone[int(randsec[2]):9]) + "\n"card.add(sim) # 添加新生成的防伪码到集合# 如果添加到集合,证明生成的防伪码与原有的防伪码没有产生重复if len(card) > addcount:randstr.append(sim) # 添加新生成的防伪码到新防伪码列表addcount = len(card) # 记录最添加新生成防伪码集合的防伪码数量if len(randstr) >= int(incount): # 如果新防伪码列表中的防伪码数量达到输入的防伪码数量print(len(randstr)) # 输出已生成防伪码的数量break # 退出循环# 调用函数wfile()函数,实现生成的防伪码屏幕输出和文件输出wfile(randstr, nres_letter + "ncode" + str(choice) + ".txt", nres_letter, "生成后补防伪码共计:","codeadd")# tkinter.messagebox.showinfo("提示", "已生成补充防伪码共:" + str(len(randstr))) # 提示# root.withdraw()# 条形码EAN13批量生成函数
def scode7(schoice):mainid = inputbox("\033[1;32m 请输入EN13的国家代码(3位) :\33[0m", 3, 3) # 输入3位国家代码# while int(mainid) < 1 or len(mainid) != 3: # 验证输入是否为3位数字(转为整数后小于1和长度不等于3,重新输入)# mainid = inputbox("\033[1;32m 请输入EAN13的国家代码(3位)::\33[0m", 1, 0)compid = inputbox("\033[1;32m 请输入EAN13的企业代码(4位):\33[0m", 3, 4) # 输入4位企业代码# while int(compid) < 1 or len(compid) != 4: # 验证输入是否为4位数字# compid = inputbox("\033[1;32m 请输入EAN13的企业代码(4位):\33[0m", 1, 0)incount = inputbox("\033[1;32m 请输入要生成的条形码数量:\33[0m", 1, 0) # 输入要生成的条形码数量while int(incount) == 0: # 输入信息转为整数后等于0,重新输入incount = inputbox("\033[1;32m 请输入要生成的条形码数量:\33[0m", 1, 0)mkdir("barcode") # 判断保存条形码的文件夹是否存在,不存在,则创建该文件夹for j in range(int(incount)): # 批量生成条形码strone = '' # 清空存储单条条形码的变量for i in range(5): # 生成条形码的6位(除国家代码、企业代码和校验位之外的6位)数字strone = strone + str(random.choice(number))barcode=mainid +compid +strone # 把国家代码、企业代码和新生成的随机码进行组合# 计算条形码的校验位evensum = int(barcode[1]) + int(barcode[3]) + int(barcode[5]) + int(barcode[7]) + int(barcode[9]) +int(barcode[11]) # 偶数位oddsum =int( barcode[0])+int(barcode[2])+int(barcode[4])+int(barcode[6])+int(barcode[8]) +int(barcode[10])# checkbit=int(10-(evensum *3 + oddsum)%10)checkbit = int((10 - (evensum * 3 + oddsum) %10)% 10)barcode=barcode+str(checkbit) # 组成完整的EAN13条形码的13位数字print (barcode)encoder = EAN13Encoder(barcode) # 调用EAN13Encoder生成条形码encoder.save("barcode\\" + barcode + ".png") # 保存条形码信息图片到文件# 本函数生成固定的12位二维码,读者可以根据实际需要修改成按输入位数进行生成的函数
def scode8(schoice):# 输入要生成的二维码数量incount = inputbox("\033[1;32m 请输入要生成的12位数字二维码数量:\33[0m", 1, 0)while int(incount) == 0: # 如果输入不是大于0的数字,重新输入incount = inputbox("\033[1;32m 请输入要生成的12位数字二维码数量:\33[0m", 1, 0)mkdir("qrcode") # 判断保存二维码的文件夹是否存在,不存在,则创建该文件夹for j in range(int(incount)): # 批量生成二维码strone = '' # 清空存储单条二维码的变量for i in range(12): # 生成单条二维码数字strone = strone + str(random.choice(number))encoder =qrcode.make(strone) # 生成二维码encoder.save("qrcode\\" + strone + ".png") # 保存二维码图片到文件#抽奖函数
def scode9(schoice):default_dir = r"lottery.ini" # 设置默认打开文件为开发路径下的"lottery.ini"# 选择包含用户抽奖信息票号的文件,扩展名为“*.ini”file_path = tkinter.filedialog.askopenfilename(filetypes=[("Ini file","*.ini")],title=u"请选择包含抽奖号码的抽奖文件:",initialdir=(os.path.expanduser(default_dir)))codelist = openfile(file_path) # 调用 openfile()函数读取刚打开的抽奖文件codelist = codelist.split("\n") # 通过回行转义符把抽奖信息分割成抽奖数列incount = inputbox("\033[1;32m 请输入要生成的中奖数量:\33[0m", 1, 0) # 要求用户输入中(抽)奖数量while int(incount) == 0 or len(codelist)< int(incount): # 如果输入中(抽)奖数量等于0或超过抽奖数组数量,重新输入incount = inputbox("\033[1;32m 请输入要生成的抽奖数量:\33[0m", 1, 0)strone = random.sample(codelist,int(incount)) # 根据输入的中奖数量进行抽奖print("\033[1;35m 抽奖信息名单发布: \33[0m")for i in range(int(incount)): # 循环将抽奖数列的引号和中括号去掉wdata = str(strone[i].replace('[', '')).replace(']', '') # 将抽奖数列的中括号去掉wdata = wdata.replace(''''','').replace(''''', '') # 将抽奖数列的引号去掉print("\033[1;32m " + wdata + "\33[0m") # 输出中奖信息# 输入数字验证,判断输入是否在0-9之间的整数
def input_validation(insel):if str.isdigit(insel):insel = int(insel)# if insel == 0:# # print("\033[1;31;40m 输入非法,请重新输入!!\033[0m")# return 0# else:# return inselreturn inselelse:print("\033[1;31;40m 输入非法,请重新输入!!\033[0m")return 0# 企业编码管理系统主菜单
def mainmenu():# os.system("clear")print("""\033[1;35m****************************************************************企业编码生成系统****************************************************************1.生成6位数字防伪编码 (213563型)2.生成9位系列产品数字防伪编码(879-335439型)3.生成25位混合产品序列号(B2R12-N7TE8-9IET2-FE35O-DW2K4型)4.生成含数据分析功能的防伪编码(5A61M0583D2)5.智能批量生成带数据分析功能的防伪码6.后续补加生成防伪码(5A61M0583D2)7.EAN-13条形码批量生成8.二维码批量输出 9.企业粉丝防伪码抽奖0.退出系统================================================================说明:通过数字键选择菜单================================================================\033[0m""")def codeprint(cstr, cint):str1 = cstr[0]str2 = cstr[1]str3 = cstr[2]for i in range(int(cint)):strbook = str1 + str2 + random.choice(letter) + random.choice(letter) + random.choice(letter) + str2 + str3print(strbook)# 通过循环控制用户对程序功能的选择
while i < 9:# 调入程序主界面菜单mainmenu()# 键盘输入需要操作的选项choice = input("\033[1;32m 请输入您要操作的菜单选项:\33[0m")if len(choice) != 0: # 输入如果不为空choice = input_validation(choice) # 验证输入是否为数字if choice == 1:scode1( str(choice)) # 如果输入大于零的整数,调用scode1()函数生成注册码# 选择菜单2,调用scode2()函数生成9位系列产品数字防伪编码if choice == 2:scode2(choice)# 选择菜单3,调用scode3()函数生成25位混合产品序列号if choice == 3:scode3(choice)# 选择菜单4,调用scode4()函数生成含数据分析功能的防伪编码if choice == 4:scode4(choice)# 选择菜单5,调用scode5()函数智能批量生成带数据分析功能的防伪码if choice == 5:scode5(choice)# 选择菜单6,调用scode6()函数后续补加生成防伪码if choice == 6:scode6(choice)# 选择菜单7,调用scode7()函数批量生成条形码if choice == 7:scode7( choice)# 选择菜单8,调用scode8()函数批量生成二维码if choice == 8:scode8( choice)# 选择菜单9,调用scode9()函数生成企业粉丝抽奖程序if choice == 9:scode9( choice)# 选择菜单0,退出系统if choice == 0:i = 0print("正在退出系统!!")breakelse:print("\033[1;31;40m 输入非法,请重新输入!!\033[0m")time.sleep(2)
源码及说明文档下载路径
企业编码管理的程序-python源码-可执行程序
相关文章:
![](https://img-blog.csdnimg.cn/bed8f7524c4f49ce906eea80c0c6156c.png)
python例程:《企业编码生成系统》程序
目录《企业编码生成系统》程序使用说明主要代码演示源码及说明文档下载路径《企业编码生成系统》程序使用说明 在PyCharm中运行《企业编码生成系统》即可进入如图1所示的系统主界面。在该界面中可以选择要使用功能对应的菜单进行不同的操作。在选择功能菜单时,只需…...
![](https://www.ngui.cc/images/no-images.jpg)
基于EB工具的TC3xx_MCAL配置开发04_ADC模块软件触发Demo配置
目录 1.概述2. EB配置2.1 添加HwUnit2.2 AdcPrescale配置2.3 添加ADC通道2.4 添加Adc Group2.5 Adc Group配置2.5.1 AdcGroup->General2.5.2 AdcGroup->AdcNotification2.5.3 AdcGroup->AdcGroupDefinition2.5.4 AdcGroup->AdcResRegDefinition2.6 中断配置1.概述 …...
![](https://img-blog.csdnimg.cn/190976d8dc5c469c9b21e267e9cf293d.gif#pic_center)
内存操作函数
前言 🎈个人主页:🎈 :✨✨✨初阶牛✨✨✨ 🐻推荐专栏: 🍔🍟🌯 c语言进阶 🔑个人信条: 🌵知行合一 🍉本篇简介:>:介绍c语言中有关指针更深层的知识. 金句分享: ✨未来…...
![](https://img-blog.csdnimg.cn/3819aa061ef24913a330092c2d1625bf.png)
免费搭建个人博客
免费搭建个人博客,并发布到公网 利用hexo搭建个人博客,通过gitee的pages发布到公网 1 前置准备 安装git、安装node.js(尽量选择长期支持的版本) node.js官网:https://nodejs.org/en/ git官网:https://git-scm.com/book/zh/v2 安装…...
![](https://img-blog.csdnimg.cn/aefd052778cd46a9984bee490f847034.png#pic_center)
【Vue全家桶】详解Vue Router(一)
【Vue全家桶】Vue Router详解(一) Vue系列文章目录: 内容参考链接Vue(一)【Vue全家桶】邂逅Vue、Vue的多种引入方式Vue(二)【Vue全家桶】声明式编程、MVVMVue(三)【Vue…...
![](https://img-blog.csdnimg.cn/img_convert/38ef11086424b4a22006c33a7c66e612.jpeg)
9大 HIVE SQL 最频繁被问到的面试题
SQL是用于数据分析和数据处理的最重要的编程语言之一,因此与数据科学相关的工作(例如数据分析师、数据科学家和数据工程师)在面试时总会问到关于 SQL 的问题。 SQL面试问题旨在评估应聘者的技术和解决问题的能力。因此对于应聘者来说&#x…...
![](https://img-blog.csdnimg.cn/img_convert/ca595786e857e2dd2be053b7818c5e3f.webp?x-oss-process=image/format,png)
学大数据算跟风吗?
随着互联网、物联网和人工智能等技术的不断发展,大数据技术逐渐进入人们的视野,成为一个备受关注的热点话题。那么,大数据专业好学吗?前景如何?下面我们来一起探讨一下。 一、大数据专业的学习难度 大数据技术是一种综…...
![](https://img-blog.csdnimg.cn/img_convert/383475ea6a445d217d526e6e664d7984.png)
[C#]关于ListBox的坑
在用C#写个Demo程序的时候,使用ListBox保存读取到的每行内容。然后在重复读取的时候需要清除ListBox中的内容,我看到ListBox有清除的函数:lsbFiles.Items.Clear();以为这个函数就可以解决所有的问题,但是....于是想了个方法准备一…...
![](https://img-blog.csdnimg.cn/926b3a9dffb64d8e9bc2a876073f80c2.png)
Apache POI 入门·第一话
文章目录1 摘要2 Apache POI2.1 介绍2.2 应用场景2.3 入门案例2.3.1 将数据写入Excel文件2.3.1.1 导入POI maven坐标2.3.1.2 代码开发2.3.1.3 实现效果2.3.2 读取Excel文件中的数据2.3.3 实现效果2.4 开发案例——导出运营数据Excel报表2.4.1 产品原型2.4.2 接口设计2.4.3 代码…...
![](https://img-blog.csdnimg.cn/a60bb2fbc41140e6b06552886a245782.png)
8个python自动化脚本提高打工人幸福感~比心~
人生苦短,我用Python 最近有许多打工人都找我说打工好难 每天都是执行许多重复的任务, 例如阅读新闻、发邮件、查看天气、打开书签、清理文件夹等等, 使用自动化脚本,就无需手动一次又一次地完成这些任务, 非常方便…...
![](https://csdnimg.cn/release/blog_editor_html/release2.2.4/ckeditor/plugins/CsdnLink/icons/icon-default.png?t=N2N8)
【嵌入式烧录/刷写文件】-1-详解Motorola S-record(S19/SREC/mot/SX)格式文件
目录 1 什么是Motorola S-record 2 Motorola S-record的格式 2.1 Motorola S-record的结构 2.1.1 “Record type记录类型”的说明 2.1.2 “Record length记录长度”的说明 2.1.3 如何计算“Checksum校验和” 2.2 Record order记录顺序 2.3 Text line terminator文本行终…...
![](https://img-blog.csdnimg.cn/f5a7453c91a044b5b1087c0dc5bad13f.png)
图形视图界面 图形效果
Qt的标准图形效果类: QGraphicsBlurEffect提供模糊效果QGraphicsColorizeEffect提供染色效果QGraphicsDropShadowEffect提供阴影效果QGraphicsOpacityEffect提供透明效果 QGraphicsBlurEffect(模糊效果) 模糊效果会模糊源。此效果对于减少细…...
ElementUI学习笔记
目录 一、简单介绍 二、安装 1、下载 2、引入 三、布局 1、简介 2、使用 3、好处 四、布局容器 1、常见排布 2、调整样式 五、按钮 1、简单引用 2、改变样式 3、加载中效果 六、表格 1、简单使用 2、样式修改 七、对话框 1、简单使用 2、添加自定义内容 3、…...
![](https://img-blog.csdnimg.cn/738aa14efddc4c23b28a5e0ba534548c.png)
安装KVM并创建虚拟机及基本使用
#环境说明:Centos7 环境准备: CPU开启虚拟化,给宿主机的CPU和内存分配足够多的配置 安装KVM 1.安装相关软件包 yum -y install qemu-kvm libvirt virt-manager virt-install virt-viewer 软件包简介: qemu-kvm: 为kvm提供…...
![](https://img-blog.csdnimg.cn/bed086c824e34a9c8ce6625a4706b678.png)
一种LCD屏闪问题的调试
背景 项目使用ESP32-S3 RGB接口驱动的LCD, 框架 idf-v5.0, LVGL-v7.11 显示画面正常, 但肉眼可见的像是背光在闪烁, 背光电路是应用很久的经典电路, 且排查背光驱动无错, 但开机一段时间后, 闪烁会明显减轻 记录 这块屏的显示驱动芯片为ST7701S, 查看芯片手册有说明特定的上…...
![](https://img-blog.csdnimg.cn/8c111f3c41ba4151a5972e2b37e678f3.jpeg#pic_center)
Java程序运行在Docker等容器环境有哪些新问题?
第30讲 | Java程序运行在Docker等容器环境有哪些新问题? 如今,Docker 等容器早已不是新生事物,正在逐步成为日常开发、部署环境的一部分。Java 能否无缝地运行在容器环境,是否符合微服务、Serverless 等新的软件架构和场景&#x…...
![](https://www.ngui.cc/images/no-images.jpg)
C语言面试最常问的三个关键字
文章目录前言一,static关键字的作用二,const 关键字的作用2.1, 修饰局部变量2.2,修饰指针2.3, 修饰函数形参2.4,修饰函数的返回值三,volatile关键字的作用前言 面试的时候,C语言最常…...
![](https://img-blog.csdnimg.cn/973d3325cdbe46e4ac757461172e065f.png)
【Linux】-初识Linux
作者:学Java的冬瓜 博客主页:☀冬瓜的主页🌙 专栏:【Linux】 分享:逆着光行走,任风吹雨打。 ——《起风了》 主要内容:Linux的一些最基本指令,Linux的小程序,Linux关于连…...
![](https://img-blog.csdnimg.cn/img_convert/c71589e13843201327806d08d3513a43.jpeg)
精选7个 Python 学习资源库,助你成为优秀的开发者
当你在学习编程时,很容易被大量的资源所吓到,不知道该从何开始。 GitHub 仓库是一个很好的起点,因为它们提供了一种非常实用的方式来了解实际的编程应用。你可以查看其他人的代码,并将其与自己的代码进行比较和学习。 当涉及到 …...
![](https://img-blog.csdnimg.cn/0dc1a6b7422b4dfb8565cbadb059b280.png)
【大数据处理与可视化】三 、Pandas库的运用
【大数据处理与可视化】三 、Pandas库的运用实验目的实验内容实验步骤一、使用pandas库分别创建Series对象和DataFrame对象,并对创建的对象使用索引、排序等相关操作;练习DataFrame对象的统计计算和统计描述的功能。1&2、创建一个DataFrame(d…...
![](https://img-blog.csdnimg.cn/ea5e95cbdf2c4b68b86015820e732d89.png)
FPGA解码SDI视频任意尺寸缩放拼接输出 提供工程源码和技术支持
目录1、前言2、SDI理论练习3、设计思路和架构SDI摄像头Gv8601a单端转差GTX解串SDI解码VGA时序恢复YUV转RGB图像缩放FDMA图像缓存实现拼接HDMI驱动4、vivado工程详解5、上板调试验证并演示6、福利:工程代码的获取1、前言 FPGA实现SDI视频编解码目前有两种方案&#…...
![](https://www.ngui.cc/images/no-images.jpg)
线索二叉树结构
线索二叉树结构1.线索二插树的作用2.线索二叉树的定义3.线索二叉树的结构4. 线索二叉树的操作4.1. 建立一棵中序线索二叉树4.2. 在中序线索二叉树上查找任意结点的中序前驱结点4.3. 在中序线索二叉树上查找任意结点的中序后继结点4.4. 在中序线索二叉树上查找任意结点在先序下的…...
![](https://img-blog.csdnimg.cn/6abd1e2f88e3453ba395c69c42e08b1c.png)
6.网络爬虫——BeautifulSoup详讲与实战
网络爬虫——BeautifulSoup详讲与实战BeautifulSoup简介:BS4下载安装BS4解析对象Tag节点遍历节点find_all()与find()find_all()find()豆瓣电影实战前言: 📝📝此专栏文章是专门针对网络爬虫基础,欢迎免费订阅&#…...
![](https://www.ngui.cc/images/no-images.jpg)
Vue:路由管理模式
三种模式 Vue.js 的路由管理有三种模式: Hash 模式(默认):在 URL 中使用 # 符号来管理路由。例如,http://example.com/#/about。这个模式的好处是可以避免浏览器向服务器发送不必要的请求,并且不需要特殊…...
![](https://img-blog.csdnimg.cn/0f5d8d6936574ed588f5aedbb3c83129.png)
7个最好的PDF编辑器,帮你像编辑Word一样编辑PDF
PDF 是具有数字思维的组织的重要交流工具。提供高效的工作流程和更好的安全性,可以创建重要文档并与客户、同事和员工共享。文档的布局已锁定,因此无论在什么设备上查看,格式都保持不变。这是让每个人保持一致的好方法——尤其是那些使用Micr…...
![](https://img-blog.csdnimg.cn/958eb4e438d344d0b5a5760f6c9d5a05.png)
【数据结构】树的介绍
文章目录前言树的概念及结构树的概念树的表示树在实际中的运用二叉树的概念及结构二叉树的概念现实中的二叉树特殊的二叉树二叉树的性质二叉树的储存结构顺序存储链式存储写在最后前言 🚩本章给大家介绍一下树。树的难度相对于前面的数据结构来说,又高了…...
![](https://img-blog.csdnimg.cn/img_convert/a5a3a5c2e395552d1a818b9a7ff90f21.png)
CoreDNS 性能优化
CoreDNS 作为 Kubernetes 集群的域名解析组件,如果性能不够可能会影响业务,本文介绍几种 CoreDNS 的性能优化手段。合理控制 CoreDNS 副本数考虑以下几种方式:根据集群规模预估 coredns 需要的副本数,直接调整 coredns deployment 的副本数:k…...
![](https://www.ngui.cc/images/no-images.jpg)
前端三剑客常见面试题及其答案
目录 1、什么是 HTML? 2、什么是 CSS? 3、什么是 JavaScript? 4、什么是盒模型? 5、什么是浮动? 6、什么是定位? 7、什么是选择器? 8、什么是事件? 前端的三剑客指的是 HTML…...
![](https://img-blog.csdnimg.cn/3a297cd8f156439caa5d919c4a4c0fa8.png)
【DFS专题】深度优先搜索 “暴搜”优质题单推荐 10道题(C++ | 洛谷 | acwing)
文章目录题单一、模板 [极为重要]全排列DFS组合型DFS指数DFS二、专题烤鸡 (指数BFS)P1088 火星人 【全排列】P1149 火彩棒 [预处理 ]P2036 PERKETP1135 奇怪的电梯 暴力P1036 [NOIP2002 普及组] 选数 (组合)P1596 [USACO10OCT]Lake Counting …...
![](https://www.ngui.cc/images/no-images.jpg)
微信小程序自定义组件生命周期有哪些?
微信小程序自定义组件的生命周期函数分为三类: 创建时执行的生命周期函数、更新时执行的生命周期函数和销毁时执行的生命周期函数。 下面是具体的生命周期函数及其触发时机: 创建时执行的生命周期函数: created:在组件实例刚刚…...
![](https://images2015.cnblogs.com/blog/806469/201603/806469-20160323110312683-217203123.png)
如何做增加网站留存的营销活动/seo策略主要包括
小时候对这个东西很好奇,不知道什么原理.一直觉得很好玩.现在研究了下,总结如下 软件的操作步骤很讲究,稍微不慎,则就需要重新来过 知识点: 1,掌握诺顿ghost分区为gh文件 2,学会清理至一个干净的系统 3,学会部署ghost服务器 一 通过网络批量部署系统 工具:mouse-dos https:…...
![](/images/no-images.jpg)
网站开发人员必备技能/附近电脑培训班零基础
简介 Typora是一款轻便简洁的Markdown编辑器,支持即时渲染技术,这也是与其他Markdown编辑器最显著的区别。即时渲染使得你写Markdown就想是写Word文档一样流畅自如,不像其他编辑器的有编辑栏和显示栏。 Typora删除了预览窗口,以…...
![](https://img-blog.csdnimg.cn/img_convert/00e27ab806e4881f8254fe7ae8741834.png)
网站增加关键词/营销qq下载
满意答案来欧冠03002017.04.23采纳率:57% 等级:8已帮助:211人从API 8开始,新增了一个类:android.media.ThumbnailUtils这个类提供了3个静态方法一个用来获取第一帧得到的Bitmap,2个对图片进行缩略处理。…...
![](/images/no-images.jpg)
急求一张 网站正在建设中的图片/个人怎么在百度上做推广
最近在调试单片机程序,总是遇到一些开始认为不可思议的事情,后来解决了问题后发现,都是因为自己书写程序不严谨,其主要原因是没有注意c语言的数据类型的数据范围。 对有符号、无符号数据的使用存在误区,对类型转换理解…...
![](https://img-blog.csdnimg.cn/img_convert/d5c74eaa041fd384da01499dd9ef9853.png)
搞笑网站全站源码/余姚关键词优化公司
1.部分反射API是泛型1.1获取反射API的泛型部分反射API是泛型,如Class是泛型//如果使用Class,不带泛型,出现compile warning编译警告Class clazz1 String.class;String str1 (String) clazz1.newInstance();//改写为带泛型的Class࿰…...
![](https://static.oschina.net/uploads/img/201709/10005235_Cy78.png)
怎么在工商局网站查公司/互联网营销方案策划
一、继承 继承是一种创建新的类的方式,在python中,新建的类可以继承自一个或者多个父类,原始类称为基类或超类,新建的类称为派生类或子类。 python中类的继承分为:单继承和多继承 class ParentClass1: #定义父类passcl…...