You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

循环无法按指定次数终止且触发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()

主要修改点说明:

  1. 提前把文件里的所有代码读到codes列表里,避免文件指针的问题,同时用with语句自动关闭文件,更安全
  2. 重构了ser()函数,加入了非数字输入的异常处理,以及对0和负数的判断
  3. 完全重写了循环逻辑:取文件代码和指定次数的最小值,确保不会超出文件内容的长度,也不会超出指定次数
  4. 在循环里加入了if not isClicking: break,支持中途关闭循环
  5. 循环结束后自动把isClicking设为False,避免重复触发
  6. 增加了各种提示,比如文件不存在、没有可用代码、次数无效等情况的提示

这样修改后,你之前遇到的TypeError、循环次数不对、文件读取异常的问题都能解决,而且界面也不会假死(如果要完全避免假死,可以把循环放到线程里,不过这个版本已经能满足基础需求了)。

备注:内容来源于stack exchange,提问作者Ralios

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 15:53:08