python - TypeError: combat(sume,sumu) missing 2 required positional arguments: sume,sumu

问题描述

写程序的时候遇到了一个问题, 题目的背景为:

描述语句
定义一个函数, 开始游戏前玩家的初始分数为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()


评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Charonmomo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值