编写硬币翻转游戏遇TypeError:function与int无法比较求解决
解决硬币翻转游戏的TypeError问题
嘿,我来帮你搞定这个报错!你遇到的TypeError: '>' not supported between instances of 'function' and 'int',核心原因是变量名和函数名重名了,导致你在比较的时候拿函数对象和整数比,肯定会出错。
问题具体分析
你定义了一个名为ticket()的函数,同时又在这个函数里尝试把全局变量ticket赋值为随机数。Python里函数也是对象,当你在flip()里写if ticket > 50:的时候,它会把ticket识别成你定义的那个函数,而不是你想存储随机数值的变量——这就直接导致了类型不匹配的错误。
另外还有几个小细节需要补全:
- 你的
flip()函数里有重复的判断逻辑,完全可以简化; - 代码里没显示导入
decimal和random模块,运行时会额外报错,需要补上; - 点击"Flip It!"按钮时,应该先生成随机的
ticket值,再进行胜负判断,否则拿不到最新的随机数。
修正后的完整代码
import random import decimal from tkinter import Tk, Label, Button, Frame mainFrame = Frame(Tk()) mainFrame.pack() def flip(): # 每次翻转前先生成随机ticket数值 generate_ticket() # 简化胜负判断逻辑:玩家选择的区间和随机数区间一致则获胜 if (player_ticket > 50 and ticket > 50) or (player_ticket < 50 and ticket < 50): result_text = "YOU WON!!!" result_color = "green" else: result_text = "YOU LOST!!!" result_color = "red" # 创建并显示结果标签 result = Label(mainFrame, text=result_text, fg=result_color) result.grid(row=3, columnspan=2) def ticket_heads(): global player_ticket player_ticket = decimal.Decimal(random.randrange(0, 50)) def ticket_tails(): global player_ticket player_ticket = decimal.Decimal(random.randrange(50, 100)) # 重命名函数,避免和变量名ticket冲突 def generate_ticket(): global ticket ticket = decimal.Decimal(random.randrange(0, 100)) # UI元素布局 heads_text = Label(mainFrame, text="Heads") heads_text.grid(row=0, column=0) tails_text = Label(mainFrame, text="Tails") tails_text.grid(row=0, column=1) heads_select = Button(mainFrame, text="Select", command=ticket_heads) heads_select.grid(row=1, column=0) tails_select = Button(mainFrame, text="Select", command=ticket_tails) tails_select.grid(row=1, column=1) flipit = Button(mainFrame, text="Flip It!", command=flip) flipit.grid(row=2, columnspan=2) mainFrame.mainloop()
关键修复点
- 把原来的
ticket()函数改名为generate_ticket(),彻底解决函数名和变量名的冲突; - 在
flip()函数开头调用generate_ticket(),确保每次点击Flip按钮都生成新的随机数值; - 简化了胜负判断逻辑,让代码更易读;
- 补上了必要的模块导入,保证代码能正常运行。
现在运行代码应该就不会再报错啦!
内容的提问来源于stack exchange,提问作者Okym
相关产品推荐
相关产品推荐

