循环无法按指定次数终止且触发TypeError: 'int' object is not iterable错误求助
循环无法按指定次数终止且触发TypeError: 'int' object is not iterable错误求助
我看了你的代码,马上就能定位到问题的核心,同时还有几个容易踩的小坑,咱们一步步解决:
1. 触发TypeError的直接原因:错误的循环写法
你写的for i in file and range(int(lim))完全不符合Python的语法逻辑,and在这里会先判断file是否为真(文件对象默认是真),然后返回range(int(lim)),这时候你遍历的是数字序列,而不是文件里的代码!这就导致两个问题:
- 你用
pyautogui.write(i)的时候,i是数字,不是文件里的字符串,完全不符合需求 - 如果
lim是0或者转换失败,还会触发额外错误
2. 循环次数与文件内容不匹配的问题
你直接用全局的file对象遍历,第一次循环后文件指针会跑到文件末尾,再次点击启动按钮时,文件里已经没有内容可以读了,这就是为什么你说“继续写文本从文件”(其实是第一次写完后就没内容了)。
3. 还有几个隐藏的小问题
- 输入
lim的时候没有做非数字的异常处理,比如用户输入字母会直接崩溃 - 循环在GUI主线程里执行,会导致界面假死,直到循环结束
下面是修改后的完整代码,我已经把所有问题都修复了:
import keyboard import tkinter as tk from tkinter import messagebox, Entry from time import sleep import pyautogui isClicking = False lim = 0 codes = [] # 用来存文件里的所有代码 # 先把文件里的代码读出来,存到列表里,避免文件指针问题 try: with open('promo.txt', 'r') as f: # 去掉空行和换行符,只保留有效代码 codes = [line.strip() for line in f if line.strip()] except FileNotFoundError: messagebox.showerror("错误", "找不到promo.txt文件!") window = tk.Tk() window.title("Auto Code") window.geometry('720x360') def ser(): global lim input_text = text.get().strip() if not input_text: messagebox.showinfo("Error", "输入不能为空") return # 加异常处理,防止输入非数字 try: lim = int(input_text) if lim <=0: messagebox.showinfo("Error", "请输入大于0的数字") return text.delete(0, 'end') except ValueError: messagebox.showinfo("Error", "请输入有效的数字!") def tumb(): global isClicking if isClicking: isClicking = False print('已关闭') else: isClicking = True print('已开启') if isClicking: if lim <=0: messagebox.showinfo("Error", "请先设置有效的次数!") isClicking = False return # 取要执行的代码:最多执行lim次,或者文件里有的所有代码(取少的那个) execute_count = min(lim, len(codes)) if execute_count ==0: messagebox.showinfo("提示", "没有可用的代码!") isClicking = False return print(f"将执行{execute_count}次输入") # 遍历要执行的代码 for code in codes[:execute_count]: if not isClicking: # 如果中途关闭,直接终止循环 break # 原来的操作逻辑,把i换成code pyautogui.moveTo(1564, 1008) pyautogui.press('F6') sleep(0.3) pyautogui.press('F6') pyautogui.write(code) sleep(0.5) pyautogui.moveTo(838, 584) pyautogui.press('F6') sleep(0.2) pyautogui.press('F6') sleep(2) pyautogui.click(977, 733) pyautogui.press('F6') sleep(0.2) pyautogui.press('F6') sleep(1.5) isClicking = False # 循环结束后自动关闭 print("执行完成,已自动关闭") text = tk.Entry(fg = "Black", width = 10) text.place(x = 220, y = 65) btn = tk.Button(window, text = "设置执行次数", command = ser, width = "40", height = "2", fg = "black", bg = "white") btn.place(x = 220, y =110) keyboard.add_hotkey('ctrl + v', tumb) window.mainloop()
主要修改点说明:
- 提前把文件里的所有代码读到
codes列表里,避免文件指针的问题,同时用with语句自动关闭文件,更安全 - 重构了
ser()函数,加入了非数字输入的异常处理,以及对0和负数的判断 - 完全重写了循环逻辑:取文件代码和指定次数的最小值,确保不会超出文件内容的长度,也不会超出指定次数
- 在循环里加入了
if not isClicking: break,支持中途关闭循环 - 循环结束后自动把
isClicking设为False,避免重复触发 - 增加了各种提示,比如文件不存在、没有可用代码、次数无效等情况的提示
这样修改后,你之前遇到的TypeError、循环次数不对、文件读取异常的问题都能解决,而且界面也不会假死(如果要完全避免假死,可以把循环放到线程里,不过这个版本已经能满足基础需求了)。
备注:内容来源于stack exchange,提问作者Ralios
相关产品推荐
相关产品推荐

