1 import os 2 import qrcode 3 import random 4 import time 5 import tkinter 6 from pystrich.ean13 import EAN13Encoder 7 import tkinter.filedialog 8 import tkinter.messagebox 9 from string import digits 10 11 root = tkinter.Tk() # tkinter模4 12 # 块为python的标准图形界面接口。本代码的目的是创建根窗口 13 # 初始化数据 14 number = "1234567890" 15 letter = "ABCDEFGHIJKLMNPQRSTUVWXYZ1234567890" 16 allis = "1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz!@#$%^&*()_+" 17 i = 0 18 19 randstr = [] 20 fourth = [] 21 fifth = [] 22 randfir = "" 23 randsec = "" 24 randthr = "" 25 str_one = "" 26 strone = "" 27 strtwo = "" 28 nextcard = "" 29 userput = "" 30 nres_letter = "" 31 32 33 # 建立文件夹函数 34 def mkdir(path): 35 isexists = os.path.exists(path) # 判断文件夹路径是否存在 36 if not isexists: # 若是文件夹路径不存在 37 os.mkdir(path) # 建立要建立的文件夹 38 39 40 # 读取文件内容函数 41 def openfile(filename): 42 f = open(filename) # 打开指定文件 43 fllist = f.read() # 读取文件内容 44 f.close() # 关闭文件 45 return fllist # 返回读取的文件内容 46 47 48 # 输入验证函数,showstr为input函数提供动态输入提示文字,showorder提供验证方式,length提供要求输入数据的长度 49 def inputbox(showstr,showorder,length): 50 instr = input(showstr) # 使用input函数要求用户输入信息,showstr为输入提示文字 51 if len(instr) != 0: # 输入数据的长度不为零 52 # 根据输入数据的要求,分红三种验证方式验证,1:数字,不限位数;2:字母;3:数字且有位数要求 53 if showorder == 1: # 验证方式 ,数字格式,不限位数,大于零的整数 54 if str.isdigit(instr): # 验证是否为数字 55 if instr == 0: # 验证数字是否为0,若是是,要求从新输入,返回值为0 56 print("\033[1;31;40m 输入为零,请从新输入!!\033[0m") # 要求从新输入,返回值为“0” 57 return "0" # 函数返回值为“0”,为何返回值为“0”呢?读者思考一下 58 else: # 若是输入正确,返回输入的数据给返回值 59 return instr #将输入的数据传给函数返回值 60 else: # 若是输入不是数字,要求用户从新输入,函数返回值为“0” 61 print("\033[1;31;40m输入非法,请从新输入!!\033[0m") # 要求用户从新输入 62 return "0" # 函数返回值为“0” 63 if showorder == 2: # 验证方式2 ,要求字母格式,且是三个字母 64 if str.isalpha(instr): # 判断输入是否为字母 65 if len(instr) != length: # 判断输入的是否为三个字母,若是不是,则要求从新输入,返回值为“0” 66 print("\033[1;31;40m必须输入三个字母,请从新输入!!\033[0m") # 要求从新输入 67 return "0" # 返回值为“0” 68 else: # 若是输入是三个字母,返回输入的字母 69 return instr # 将函数返回值设置为输入的字母 70 else: # 若是输入不是字母 71 print("\033[1;31;40m输入非法,请从新输入!!\033[0m") # 要求从新输入 72 return "0" # 返回值为“0” 73 if showorder == 3: # 验证方式3 ,要求数字格式,且输入数字位数有要求 74 if str.isdigit(instr): # 验证是否为数字 75 if len(instr) != length: # 验证输入数字是否为要求长度位数,若是不是3位数字,则要求从新输入 76 print("\033[1;31;40m必须输入" + str(length) + "个数字,请从新输入!!\033[0m") # 要求从新输入 77 return "0" # 返回值为“0” 78 else: # 输入数字知足要求,设置函数返回值为输入信息 79 return instr #设置函数返回值为输入信息 80 else: # 若是输入不是数字 81 print("\033[1;31;40m输入非法,请从新输入!!\033[0m") # 提示输入非法,要求从新输入 82 return "0" # 函数返回值为“0” 83 else: # 若是没有输入任何内容,即输入为空 84 print("\033[1;31;40m输入为空,请从新输入!!\033[0m") # 提示输入为空,要求从新输入 85 return "0" # 函数返回值为“0” 86 87 88 # 实现屏幕输出和文件输出编码信息函数,# sstr参数为输出防伪码数据, sfile为输出的文件名称 89 # typeis设置输出完成后是否经过信息框提示, smsg为信息提示框的提示文字,datapath 保存防伪码的文件夹 90 def wfile(sstr, sfile, typeis, smsg,datapath): 91 mkdir(datapath) # 调用该函数建立文件夹 92 datafile = datapath + "\\" + sfile # 设置保存防伪码的文件(包含路径) 93 file = open(datafile, 'w') # 打开保存防伪码的文件,若是文件不存在,则建立该文件 94 wrlist = sstr # 将防伪码信息赋值给wrlist 95 pdata = "" # 清空变量pdata,pdata存储屏幕输出的防伪码信息 96 wdata = "" # 清空变量 wdata , wdata 存储保存到文本文件的防伪码信息 97 for i in range(len(wrlist)): # 按条循环读取防伪码数据 98 wdata = str(wrlist[i].replace('[', '')).replace(']', '') # 去掉字符的中括号 99 wdata = wdata.replace(''''','').replace(''''', '') # 去掉字符的引号 100 file.write(str(wdata)) # 写入保存防伪码的文件 101 pdata = pdata + wdata # 将单条防伪码存储到pdata 变量 102 file.close() # 关闭文件 103 print("\033[1;31m" + pdata + "\033[0m") # 屏幕输出生成的防伪码信息 104 if typeis != "no": # 是否显示“输出完成”的信息提示框。若是typeis的值为“no”,不现显示 105 # 显示“输出完成”的信息提示框。显示信息包含方位信息码的保存路径 106 tkinter.messagebox.showinfo("提示", smsg + str(len(randstr)) + "\n 防伪码文件存放位置:" + datafile) 107 root.withdraw() # 关闭辅助窗口 108 # 实现屏幕输出和文件输出编码信息,参数schoice设置输出的文件名称 109 110 111 def scode1( schoice): 112 # 调用inputbox函数对输入数据进行非空、输入合法性判断 113 incount = inputbox("\033[1;32m 请输入您要生成验证码的数量:\33[0m", 1, 0) 114 while int(incount) == 0: # 若是输入为字母或数字0,则要求从新输入 115 incount = inputbox("\033[1;32m 请输入您要生成验证码的数量:\33[0m", 1, 0) 116 randstr.clear() # 清空保存批量注册码信息的变量randstr 117 for j in range(int(incount)): # 根据输入的验证码数量循环批量生成注册码 118 randfir = '' # 设置存储单条注册码的变量为空 119 for i in range(6): # 循环生成单条注册码 120 randfir = randfir + random.choice(number) # 产生数字随机因子 121 randfir = randfir + "\n" # 在单条注册码后面添加转义换行字符“\n”,使验证码单条列显示 122 randstr.append(randfir) # 将单条注册码添加到保存批量验证码的变量randstr 123 #调用函数wfile(),实现生成的防伪码屏幕输出和文件输出 124 wfile(randstr,"scode" + str(schoice) + ".txt", "", "已生成6位防伪码共计:","codepath") 125 126 127 # 生成9位系列产品数字防伪编码函数,参数schoice设置输出的文件名称 128 def scode2(schoice): 129 ordstart = inputbox("\033[1;32m 请输入系列产品的数字起始号(3位):\33[0m", 3, 3) 130 while int(ordstart) == 0: # 若是输入非法(符号、字母或者数字0都认为是非法输入),从新输入 131 ordstart = inputbox("\033[1;32m 请输入系列产品的数字起始号(3位):\33[0m", 3, 3) 132 ordcount = inputbox("\033[1;32m 请输入产品系列的数量:", 1, 0) 133 # 若是输入的产品系列数量小于1或者大于9999,,则要求从新输入 134 while int(ordcount) < 1 or int(ordcount) > 9999: 135 ordcount = inputbox("\033[1;32m 请输入产品系列的数量:", 1, 0) 136 incount = inputbox("\033[1;32m 请输入要生成的每一个系列产品的防伪码数量:\33[0m", 1, 0) 137 while int(incount) == 0: # 若是输入为字母或数字0,则要求从新输入 138 incount = inputbox("\033[1;32m 请输入您要生成验证码的数量:\33[0m", 1, 0) 139 randstr.clear() # 清空保存批量注册码信息的变量randstr 140 for m in range(int(ordcount)): # 分类产品编号 141 for j in range(int(incount)): # 产品防伪码编号 142 randfir = '' 143 for i in range(6): # 生成一个不包含类别的产品防伪码 144 randfir = randfir + random.choice(number) # 每次生成一个随机因子 145 randstr.append(str(int(ordstart) + m) + randfir + "\n") # 将生成的单条防伪码添加到防伪码列表 146 #调用函数wfile(),实现生成的防伪码屏幕输出和文件输出 147 wfile(randstr, "scode" + str(schoice) + ".txt", "", "已生成9位系列产品防伪码共计:","codepath") 148 149 150 # 生成25位混合产品序列号函数,参数schoice设置输出的文件名称 151 def scode3(schoice): 152 # 输入要生成的防伪码数量 153 incount = inputbox("\033[1;32m 请输入要生成的25位混合产品序列号数量:\33[0m", 1, 0) 154 while int(incount) == 0: # 若是输入非法(符号、字母或者数字0都认为是非法输入),从新输入 155 incount = inputbox("\033[1;32m 请输入要生成的25位混合产品序列号数量:\33[0m", 1, 0) 156 randstr.clear() # 清空保存批量注册码信息的变量randstr 157 for j in range(int(incount)): # 按输入数量生成防伪码 158 strone = '' # 保存生成的单条防伪码,不带横线“-”,循环时清空 159 for i in range(25): 160 strone = strone + random.choice(letter) #每次产生一个随机因子,也就是每次产生单条防伪码的一位 161 # 将生成的防伪码每隔5位添加横线“-” 162 strtwo = strone[:5] + "-" + strone[5:10] + "-" + strone[10:15] + "-" + strone[15:20] + "-" + strone[20:25] + "\n" 163 randstr.append(strtwo) # 添加防伪码到防伪码列表 164 #调用函数wfile(),实现生成的防伪码屏幕输出和文件输出 165 wfile(randstr, "scode" + str(schoice) + ".txt", "", "已生成25混合防伪序列码共计:","codepath") 166 167 168 # 生成含数据分析功能防伪编码函数,参数schoice设置输出的文件名称 169 def scode4(schoice): 170 intype = inputbox("\033[1;32m 请输入数据分析编号(3位字母):\33[0m", 2, 3) 171 # 验证输入是不是三个字母,因此要判断输入是不是字母和输入长度是否为3 172 while not str.isalpha(intype) or len(intype) != 3: 173 intype = inputbox("\033[1;32m 请输入数据分析编号(3位字母):\33[0m", 2, 3) 174 incount = inputbox("\033[1;32m 请输入要生成的带数据分析功能的验证码数量:\33[0m", 1, 0) # 175 # 验证输入是不是大于零的整数,判断输入转换为整数值时是否大于零 176 while int(incount) == 0: # 若是转换为整数时为零,则要求从新输入 177 incount = inputbox("\033[1;32m 请输入要生成的带数据分析功能的验证码数量:\33[0m", 1, 0) # 178 ffcode(incount,intype,"",schoice) # 调用 ffcode函数生成注册信息 179 180 181 # 生成含数据分析功能防伪编码函数,参数scount为要生成的防伪码数量,typestr为数据分析字符 182 # 参数ismessage在输出完成时是否显示提示信息,为“no”不显示,为其余值显示;参数schoice设置输出的文件名称 183 def ffcode(scount, typestr,ismessage, schoice): 184 randstr.clear() # 清空保存批量注册码信息的变量randstr 185 # 按数量生成含数据分析功能注册码 186 for j in range(int(scount)): 187 strpro = typestr[0].upper() # 取得三个字母中的第一个字母,并转为大写,区域分析码 188 strtype = typestr[1].upper() # 取得三个字母中的第二个字母,并转为大写,颜色分析码 189 strclass = typestr[2].upper() # 取得三个字母中的第三个字母,并转为大写,版本分析码 190 randfir = random.sample(number, 3) # 随机抽取防伪码中的三个位置,不分前后 191 randsec = sorted(randfir) # 对抽取的位置进行排序并存储给randsec变量,以便按顺序排列三个字母的位置 192 letterone = "" # 清空存储单条防伪码的变量letterone 193 for i in range(9): # 生成9位的数字防伪码 194 letterone = letterone + random.choice(number) 195 # 将三个字母按randsec变量中存储的位置值添加到数字防伪码中,并放到sim变量中 196 sim = str(letterone[0:int(randsec[0])]) + strpro + str( 197 letterone[int(randsec[0]):int(randsec[1])]) + strtype + str( 198 letterone[int(randsec[1]):int(randsec[2])]) + strclass + str(letterone[int(randsec[2]):9]) + "\n" 199 randstr.append(sim) # 将组合生成的新防伪码添加到randstr变量 200 # 调用wfile()函数,实现生成的防伪码屏幕输出和文件输出 201 wfile(randstr, typestr + "scode" + str(schoice) + ".txt", ismessage, "生成含数据分析防伪码共计:","codepath") 202 203 204 # 生成含数据分析功能防伪编码函数,参数schoice设置输出的文件名称 205 def scode5(schoice): 206 default_dir = r"mrsoft.mri" # 设置默认打开的文件名称 207 208 # 打开文件选择对话框,指定打开的文件名称为"mrsoft.mri" ,扩展名为“mri”,可使用记事本打开和编辑 209 file_path = tkinter.filedialog.askopenfilename(filetypes=[("Text file","*.mri")],title=u"请选择自动防伪码智能批处理文件:", 210 initialdir=(os.path.expanduser(default_dir))) 211 codelist = openfile(file_path) # 读取从文件选择对话框选中的文件 212 print("前:",codelist) 213 codelist = codelist.split("\n") # 把读取的信息内容添加回车,以便列输出显示 214 print("后:",codelist) 215 for item in codelist: # 按读取的信息循环生成防伪码 216 codea = item.split(",")[0] # 每一行信息中用 ","分割,","前面的信息存储防伪码标准信息 217 codeb = item.split(",")[1] # 每一行信息中用 ","分割,","后面的信息存储防伪码生成的数量 218 ffcode(codeb, codea,"no" ,schoice) # 调用ffcode函数批量生成同一标识信息的防伪码 219 220 221 # 后续补加生成防伪码函数,防伪码格式为带数据分析功能注册码 222 def scode6(schoice): 223 default_dir = r"c:\ABDscode5.txt" # 设置默认打开的文件名称 224 # 按默认的文件名称打开文件选择对话框,用于打开已经存在的防伪码文件 225 file_path = tkinter.filedialog.askopenfilename(title=u"请选择已经生成的防伪码文件",initialdir=(os.path.expanduser(default_dir))) 226 codelist = openfile(file_path) # 读取从文件选择对话框选中的文件 227 codelist = codelist.split("\n") # 把读取的信息内容添加回车,以便列输出显示 228 codelist.remove("") # 删除列表中的空行 229 strset = codelist[0] # 读取一行数据,以便获取原验证码的字母标志信息 230 remove_digits = strset.maketrans("", "", digits) # 用maketrans方法建立删除数字的字符映射转换表 231 res_letter = strset.translate(remove_digits) # 根据字符映射转换表删除该条防伪码中的数字,获取字母标识信息 232 nres_letter = list(res_letter) # 把信息用列表变量nres_letter存储 233 strpro = nres_letter[0] # 从列表变量中取得第一个字母,即区域分析码 234 strtype = nres_letter[1] # 从列表变量中取得第二个字母,即色彩分析码 235 strclass = nres_letter[2] # 从列表变量中取得第三个字母,即版次分析码 236 # 去除信息中的括号和引号 237 nres_letter = strpro.replace(''''','').replace(''''', '') + strtype.replace( 238 ''''','').replace(''''', '') + strclass.replace(''''','').replace(''''', '') 239 print("sssssssssss",nres_letter) 240 card = set(codelist) # 将原有防伪码放到集合变量card中 241 # 利用tkinter的messagebox提示用户以前生成的防伪码数量 242 tkinter.messagebox.showinfo("提示", "以前的防伪码共计:" + str(len(card))) 243 root.withdraw() # 关闭提示信息框 244 incount = inputbox("请输入补充验证码生成的数量:", 1, 0) # 让用户输入新补充生成的防伪码数量 245 # 最大值按输入生成数量的2倍数量生成新防伪码,防止新生成防伪码与原有防伪码重复形成新生成的防伪码数量不够, 246 for j in range(int(incount) * 2): 247 randfir = random.sample(number, 3) # 随机产生3位不重复的数字 248 randsec = sorted(randfir) #对产生的数字排序 249 addcount = len(card) # 记录集合中防伪码的总数量 250 strone = "" # 清空存储单条防伪码的变量strone 251 for i in range(9): # 生成9位的数字防伪码 252 strone = strone + random.choice(number) 253 # 将三个字母按randsec变量中存储的位置值添加到数字防伪码中,并放到sim变量中 254 sim = str(strone[0:int(randsec[0])]) + strpro + str( 255 strone[int(randsec[0]):int(randsec[1])]) + strtype + str( 256 strone[int(randsec[1]):int(randsec[2])]) + strclass + str(strone[int(randsec[2]):9]) + "\n" 257 card.add(sim) # 添加新生成的防伪码到集合 258 # 若是添加到集合,证实生成的防伪码与原有的防伪码没有产生重复 259 if len(card) > addcount: 260 randstr.append(sim) # 添加新生成的防伪码到新防伪码列表 261 addcount = len(card) # 记录最添加新生成防伪码集合的防伪码数量 262 if len(randstr) >= int(incount): # 若是新防伪码列表中的防伪码数量达到输入的防伪码数量 263 print(len(randstr)) # 输出已生成防伪码的数量 264 break # 退出循环 265 # 调用函数wfile()函数,实现生成的防伪码屏幕输出和文件输出 266 wfile(randstr, nres_letter + "ncode" + str(choice) + ".txt", nres_letter, "生成后补防伪码共计:","codeadd") 267 # tkinter.messagebox.showinfo("提示", "已生成补充防伪码共:" + str(len(randstr))) # 提示 268 # root.withdraw() 269 270 271 # 条形码EAN13批量生成函数 272 def scode7(schoice): 273 mainid = inputbox("\033[1;32m 请输入EN13的国家代码(3位) :\33[0m", 3, 3) # 输入3位国家代码 274 # while int(mainid) < 1 or len(mainid) != 3: # 验证输入是否为3位数字(转为整数后小于1和长度不等于3,从新输入) 275 # mainid = inputbox("\033[1;32m 请输入EAN13的国家代码(3位)::\33[0m", 1, 0) 276 compid = inputbox("\033[1;32m 请输入EAN13的企业代码(4位):\33[0m", 3, 4) # 输入4位企业代码 277 # while int(compid) < 1 or len(compid) != 4: # 验证输入是否为4位数字 278 # compid = inputbox("\033[1;32m 请输入EAN13的企业代码(4位):\33[0m", 1, 0) 279 incount = inputbox("\033[1;32m 请输入要生成的条形码数量:\33[0m", 1, 0) # 输入要生成的条形码数量 280 while int(incount) == 0: # 输入信息转为整数后等于0,从新输入 281 incount = inputbox("\033[1;32m 请输入要生成的条形码数量:\33[0m", 1, 0) 282 mkdir("barcode") # 判断保存条形码的文件夹是否存在,不存在,则建立该文件夹 283 for j in range(int(incount)): # 批量生成条形码 284 strone = '' # 清空存储单条条形码的变量 285 for i in range(5): # 生成条形码的6位(除国家代码、企业代码和校验位以外的6位)数字 286 strone = strone + str(random.choice(number)) 287 barcode=mainid +compid +strone # 把国家代码、企业代码和新生成的随机码进行组合 288 # 计算条形码的校验位 289 evensum = int(barcode[1]) + int(barcode[3]) + int(barcode[5]) + int(barcode[7]) + int(barcode[9]) +int(barcode[11]) # 偶数位 290 oddsum =int( barcode[0])+int(barcode[2])+int(barcode[4])+int(barcode[6])+int(barcode[8]) +int(barcode[10]) 291 # checkbit=int(10-(evensum *3 + oddsum)%10) 292 checkbit = int((10 - (evensum * 3 + oddsum) %10)% 10) 293 barcode=barcode+str(checkbit) # 组成完整的EAN13条形码的13位数字 294 print (barcode) 295 encoder = EAN13Encoder(barcode) # 调用EAN13Encoder生成条形码 296 encoder.save("barcode\\" + barcode + ".png") # 保存条形码信息图片到文件 297 298 299 # 本函数生成固定的12位二维码,读者能够根据实际须要修改为按输入位数进行生成的函数 300 def scode8(schoice): 301 # 输入要生成的二维码数量 302 incount = inputbox("\033[1;32m 请输入要生成的12位数字二维码数量:\33[0m", 1, 0) 303 while int(incount) == 0: # 若是输入不是大于0的数字,从新输入 304 incount = inputbox("\033[1;32m 请输入要生成的12位数字二维码数量:\33[0m", 1, 0) 305 mkdir("qrcode") # 判断保存二维码的文件夹是否存在,不存在,则建立该文件夹 306 for j in range(int(incount)): # 批量生成二维码 307 strone = '' # 清空存储单条二维码的变量 308 for i in range(12): # 生成单条二维码数字 309 strone = strone + str(random.choice(number)) 310 encoder =qrcode.make(strone) # 生成二维码 311 encoder.save("qrcode\\" + strone + ".png") # 保存二维码图片到文件 312 313 314 #抽奖函数 315 def scode9(schoice): 316 default_dir = r"lottery.ini" # 设置默认打开文件为开发路径下的"lottery.ini" 317 # 选择包含用户抽奖信息票号的文件,扩展名为“*.ini” 318 file_path = tkinter.filedialog.askopenfilename(filetypes=[("Ini file","*.ini")],title=u"请选择包含抽奖号码的抽奖文件:",initialdir=(os.path.expanduser(default_dir))) 319 codelist = openfile(file_path) # 调用 openfile()函数读取刚打开的抽奖文件 320 codelist = codelist.split("\n") # 经过回行转义符把抽奖信息分割成抽奖数列 321 incount = inputbox("\033[1;32m 请输入要生成的中奖数量:\33[0m", 1, 0) # 要求用户输入中(抽)奖数量 322 while int(incount) == 0 or len(codelist)< int(incount): # 若是输入中(抽)奖数量等于0或超过抽奖数组数量,从新输入 323 incount = inputbox("\033[1;32m 请输入要生成的抽奖数量:\33[0m", 1, 0) 324 strone = random.sample(codelist,int(incount)) # 根据输入的中奖数量进行抽奖 325 326 print("\033[1;35m 抽奖信息名单发布: \33[0m") 327 for i in range(int(incount)): # 循环将抽奖数列的引号和中括号去掉 328 wdata = str(strone[i].replace('[', '')).replace(']', '') # 将抽奖数列的中括号去掉 329 wdata = wdata.replace(''''','').replace(''''', '') # 将抽奖数列的引号去掉 330 print("\033[1;32m " + wdata + "\33[0m") # 输出中奖信息 331 332 333 # 输入数字验证,判断输入是否在0-9之间的整数 334 def input_validation(insel): 335 if str.isdigit(insel): 336 insel = int(insel) 337 # if insel == 0: 338 # # print("\033[1;31;40m 输入非法,请从新输入!!\033[0m") 339 # return 0 340 # else: 341 # return insel 342 return insel 343 else: 344 print("\033[1;31;40m 输入非法,请从新输入!!\033[0m") 345 return 0 346 347 # 企业编码管理系统主菜单 348 def mainmenu(): 349 # os.system("clear") 350 print("""\033[1;35m 351 **************************************************************** 352 企业编码生成系统 353 **************************************************************** 354 1.生成6位数字防伪编码 (213563型) 355 2.生成9位系列产品数字防伪编码(879-335439型) 356 3.生成25位混合产品序列号(B2R12-N7TE8-9IET2-FE35O-DW2K4型) 357 4.生成含数据分析功能的防伪编码(5A61M0583D2) 358 5.智能批量生成带数据分析功能的防伪码 359 6.后续补加生成防伪码(5A61M0583D2) 360 7.EAN-13条形码批量生成 361 8.二维码批量输出 362 9.企业粉丝防伪码抽奖 363 0.退出系统 364 ================================================================ 365 说明:经过数字键选择菜单 366 ================================================================ 367 \033[0m""") 368 369 370 def codeprint(cstr, cint): 371 str1 = cstr[0] 372 str2 = cstr[1] 373 str3 = cstr[2] 374 for i in range(int(cint)): 375 strbook = str1 + str2 + random.choice(letter) + random.choice(letter) + random.choice(letter) + str2 + str3 376 print(strbook) 377 378 379 # 经过循环控制用户对程序功能的选择 380 while i < 9: 381 # 调入程序主界面菜单 382 mainmenu() 383 # 键盘输入须要操做的选项 384 choice = input("\033[1;32m 请输入您要操做的菜单选项:\33[0m") 385 if len(choice) != 0: # 输入若是不为空 386 choice = input_validation(choice) # 验证输入是否为数字 387 if choice == 1: 388 scode1( str(choice)) # 若是输入大于零的整数,调用scode1()函数生成注册码 389 # 选择菜单2,调用scode2()函数生成9位系列产品数字防伪编码 390 if choice == 2: 391 scode2(choice) 392 # 选择菜单3,调用scode3()函数生成25位混合产品序列号 393 if choice == 3: 394 scode3(choice) 395 # 选择菜单4,调用scode4()函数生成含数据分析功能的防伪编码 396 if choice == 4: 397 scode4(choice) 398 # 选择菜单5,调用scode5()函数智能批量生成带数据分析功能的防伪码 399 if choice == 5: 400 scode5(choice) 401 # 选择菜单6,调用scode6()函数后续补加生成防伪码 402 if choice == 6: 403 scode6(choice) 404 # 选择菜单7,调用scode7()函数批量生成条形码 405 if choice == 7: 406 scode7( choice) 407 # 选择菜单8,调用scode8()函数批量生成二维码 408 if choice == 8: 409 scode8( choice) 410 # 选择菜单9,调用scode9()函数生成企业粉丝抽奖程序 411 if choice == 9: 412 scode9( choice) 413 # 选择菜单0,退出系统 414 if choice == 0: 415 i = 0 416 print("正在退出系统!!") 417 break 418 else: 419 print("\033[1;31;40m 输入非法,请从新输入!!\033[0m") 420 time.sleep(2)