问题描述
写程序的时候遇到了一个问题, 题目的背景为:
描述 | 语句 |
---|---|
定义一个函数, 开始游戏前玩家的初始分数为sumu,对手的初始分数为sume. 游戏中玩家和对手轮流投骰子三次, 相加后分数最高的人胜出 | def combat(sume,sumu) |
定义一个投骰子的按钮,对手先投骰子(这里对手为电脑), 玩家投骰子后按钮变为"wait",即等待电脑投骰子, 玩家投骰子时按钮为"roll dice". | dice = tk.Button(window, text=“wait”, command=lambda: combat(sume, sumu)) |
游戏结束后显示最终的结果, button显示"end" | dice[‘text’] = ‘end’ |
游戏接受后点击next按钮跳转到其他页面 | 定义一个新的button,重新布局 |
最开始写的时候把sume和sumu定义为了全局变量并且赋了值, 函数为def combat(), 可以成功运行.
但后来想把sume和sumu作为参数传递时却一直报错:
TypeError: combat(sume,sumu) missing 2 required positional arguments: sume,sumu
错误原因
上网查后没找到合适的解决方法, 仔细检查发现是因为button按钮中没有传参, 调用函数的时候传参了. 即
#调用函数时
combat(10,8)
#此时button按钮中的command
dice = tk.Button(window, text=“wait”, command=combat())
后来按照网上找到的方法加了lambda, 但是还是会报错.
原因是通过button调用函数时sume和sumu仍然不会传进去, 或者传进去的并不是我希望的值.
网上找到的command传递参数的文章:(记录一下,可能我这只菜鸟以后会用得到叭)
tkinter 按钮响应函数传值
更改以后的部分相关代码
import random
import tkinter as tk
newwin = tk.Tk()
newwin.geometry('500x300') # 这里的乘是小x
l = tk.Label(newwin,textvariable=var,justify = 'left',font=('Calibri', 12))
nl = tk.Label(newwin,text="",justify = 'left',font=('Calibri', 12))
var = tk.StringVar() # 将label标签的内容设置为字符类型,用var来接收hit_me函数的传出内容用以显示在标签上
vare = tk.StringVar()
varu = tk.StringVar()
count =0
global sume,sumu
# 投骰子的函数
def combat(sume,sumu):
dice['command'] = lambda: combat(sume, sumu) #在这里更改了button的command,定义button的时候没有写command
dice.pack(side="bottom")
start.pack_forget()
global count
count +=1
#用户投骰子
if dice['text'] == "roll dice":
if count>6:
dice['text']="end"
else:
dice['text'] = 'wait'
number = random.randint(1, 6)
nl.config(text="User:")
nl.pack(side="right")
var.set(number)
l.pack(side="right")
print("user:", number)
sumu += number
#等待对手投骰子
else:
if count >5:
dice['text'] = 'end'
else:
dice['text'] = "roll dice"
number = random.randint(1, 6)
nl.config(text="Enemy:")
nl.pack(side="left")
var.set(number)
l.pack(side="left")
print("enemy:", number)
sume += number
#循环结束后,按钮变为end
if dice['text'] == 'end':
nl.pack(side="top")
nl.config(text="Game over!")
l.pack(side="top")
#我就只是简单的显示出来了,没有什么美化
tk.Label(newwin,text="Enemy").pack(side="left")
tk.Label(newwin,textvariable = vare).pack(side="left")
vare.set(sume)
tk.Label(newwin,text="User").pack(side="right")
tk.Label(newwin, textvariable=varu).pack(side="right")
varu.set(sumu)
#输出竞争的结果
if (sume > sumu):
var.set("\n you lose!")
else:
var.set("\n you win!")
dice.pack_forget()
end() #另一个函数, 一个新的页面,继续冒险游戏
def start():
combat(10, 12)
dice = tk.Button(newwin,text="wait") #投骰子的按钮
start = tk.Button(newwin,text="start", command = start)
start.pack()
#keep fresh the newwin
newwin.mainloop()