Tkinter库存系统:提交按钮不刷新条码编号及文件读写问题
问题描述
我正在搭建一个入门级库存系统,通过Tkinter输入窗口收集商品描述并存储至TXT文件,同时生成对应的条码PNG文件。目前已实现条码生成与编号写入TXT文件,但存在两个核心问题:
- 点击提交按钮时,Tkinter窗口无法刷新生成新编号
- 无法避免重复编号
注意事项:
- 关闭窗口重新打开后会生成新条码
- 使用
a+模式读写文件会产生重复编号,但商品描述写入格式正确 - 使用
r+模式时会触发预设的重复编号错误提示,但描述写入格式错误,会覆盖首行内容
现有提交按钮触发函数代码
# generate a random number number = str(random.randint(100000000000, 999999999999)) # open the text file where the data is stored for reading and writing def onClick(): # open the text file where the data is stored for reading and writing file1 = open("barcode_numbers.txt", "a+") file2 = open("item_description.txt", "a+") # do not repeat numbers if number not in file1.read(): # have a success message show up with the barcode number tkinter.messagebox.showinfo("Success!", number) # write the number to a new line in its text file file1.write(number + "\n") # generate a barcode new_code = EAN13(number, writer=ImageWriter()) # save barcode as a png with associated number new_code.save(number) # save the item description to a new line in its text file file2.write(number + ": " + item.get() + "\n") # if the number repeats, offer a messagebox error else: tkinter.messagebox.askretrycancel("ERROR", "Duplicate barcode generated. Quit or try again.") # close the text file file1.close() file2.close()
问题分析与修复方案
1. 无法刷新新编号的问题
问题原因:number变量定义在onClick()函数外部,仅在程序启动时生成一次。每次点击按钮都会复用同一个编号,不会重新生成。
修复方法:将随机编号生成逻辑移到onClick()函数内部,确保每次点击都生成新编号:
def onClick(): # 每次点击按钮时生成新的随机条码编号 number = str(random.randint(100000000000, 999999999999)) # 后续原有逻辑保持不变...
2. 重复编号无法避免的问题
问题原因:
- 使用
a+模式打开文件时,文件指针默认处于末尾位置,直接调用file1.read()会读取空内容,导致重复判断失效 - 直接通过字符串查找编号效率低,且容易出现误判(比如编号片段匹配)
修复方案:
- 单独读取已存在的条码编号,存入集合(集合查找效率远高于字符串)
- 使用
with语句自动管理文件,避免手动关闭出错 - 追加写入时使用
a模式,避免指针位置问题
修复后的完整函数代码:
def onClick(): # 每次点击生成新编号 number = str(random.randint(100000000000, 999999999999)) existing_numbers = set() # 读取已有的条码编号 try: with open("barcode_numbers.txt", "r") as f: for line in f: clean_num = line.strip() if clean_num: existing_numbers.add(clean_num) except FileNotFoundError: # 文件不存在则跳过,视为无已有编号 pass if number not in existing_numbers: # 写入条码编号 with open("barcode_numbers.txt", "a") as file1: file1.write(number + "\n") # 写入商品描述 with open("item_description.txt", "a") as file2: file2.write(f"{number}: {item.get()}\n") # 生成并保存条码图片 new_code = EAN13(number, writer=ImageWriter()) new_code.save(number) tkinter.messagebox.showinfo("Success!", number) else: tkinter.messagebox.askretrycancel("ERROR", "Duplicate barcode generated. Quit or try again.")
3. 文件模式问题说明
a+模式:打开后指针在文件末尾,读取前必须调用file.seek(0)将指针移到开头,否则read()返回空字符串,导致重复判断失效r+模式:会覆盖指针位置的内容,直接写入会覆盖文件首行,不适合追加写入场景,建议读取用r模式、追加写入用a模式分开处理
内容的提问来源于stack exchange,提问作者Emma Smith
相关产品推荐
相关产品推荐

