Python自动网课脚本报错:TypeError: 'bool' object is not callable 求助
问题排查与修复方案
首先解决你遇到的直接错误:
1. 语法错误导致的TypeError
你写的while True (now != lesson1 and now != lesson2 and now != lesson3):是错误的语法。在Python中,while后面直接跟判断条件即可,不需要额外加True再把条件括起来——这种写法会被解释器误认为你想调用True这个布尔对象(把它当作函数),所以抛出了'bool' object is not callable的错误。
把这行改成下面两种写法都可以:
# 写法1:直接写条件 while now != lesson1 and now != lesson2 and now != lesson3: # 写法2:用括号包裹条件(可选,仅用于提升可读性) while (now != lesson1 and now != lesson2 and now != lesson3):
2. 其他潜在问题修复
除了这个语法错误,你的代码还有几个会导致后续运行异常的问题:
time.sleep()缺少参数:这个方法必须传入一个数值(表示等待的秒数),比如time.sleep(1),否则会报错。- 结束时间判断逻辑错误:你的
now变量格式是"%D, %H:%M"(包含日期),但你却和单纯的时间字符串"12:00"比较,永远不会匹配。需要单独提取时间部分来判断。 - 重复代码冗余:三个课程的判断逻辑几乎一样,可以用字典来统一管理课程时间和链接,简化代码。
优化后的完整代码
import webbrowser import time # 用字典存储课程时间和对应的链接,方便维护 lessons = { "03/09/21, 14:10": "https://google.com", "03/10/21, 14:11": "https://google.com", "03/10/21, 14:12": "https://google.com" } while True: now = time.strftime("%D, %H:%M") # 检查当前时间是否在课程列表中 if now in lessons: print("LESSON IS OPENING :D") webbrowser.open(lessons[now]) # 这里假设你想等待课程结束,示例:等待到当天15:10 end_time = time.strftime("%D, ") + "15:10" while time.strftime("%D, %H:%M") != end_time: time.sleep(60) # 每分钟检查一次,减少资源消耗 break # 打开课程并等待结束后退出循环 print(f"Waiting, the current time is {now}") time.sleep(60) # 每分钟检查一次,比每秒检查更高效
代码说明
- 用字典
lessons统一管理课程时间和链接,后续新增/修改课程只需要修改字典即可,不用重复写if判断。 - 把
now的更新放到循环内部,确保每次循环都能获取最新时间。 - 调整了
sleep的间隔为60秒,减少不必要的循环次数,更节省资源。 - 修复了结束时间的判断逻辑,现在会匹配包含日期的完整时间字符串。
内容的提问来源于stack exchange,提问作者Matteo Passaro
相关产品推荐
相关产品推荐

