def 的括号中应该包含什么?

what should go into the parentheses for def?

我正在为我的 GCSE 计算程序制作一个程序。该计划适用于一所小学。 这是一个包含乘法问题的测试,它应该在最后生成最终分数

我使用 tkinter 创建程序并且一切正常但是当我创建一个 def 来生成分数时它没有 work.when 我运行我的程序它很好但我填写了测验并点击完成按钮它开始加载并给我一个程序无法运行的错误。 我认为问题出在 def 函数上,我想我需要在括号之间添加一些内容,但我不知道是什么。

这是我的整个程序:

from tkinter import*
from random import*



n1= randint(1,10)
n2= randint(1,10)
ques1 = n1, "x", n2, "="
c1= n1*n2

n1= randint(1,10)
n2= randint(1,10)
ques2 = n1, "x", n2, "="
c2= n1*n2

n1= randint(1,10)
n2= randint(1,10)
ques3 = n1, "x", n2, "="
c3= n1*n2

n1= randint(1,10)
n2= randint(1,10)
ques4 = n1, "x", n2, "="
c4= n1*n2

#window
window = Tk()
window.geometry("280x450")
window.title("quiz")
window.configure(background='yellow')

score = 0
def save(score):

    while True:
        if c1==ans1:
            score= score +1
            pass
        else:
            pass

        if c2==ans2:
            score = score+1
            pass
        else:
            pass

        if c3==ans3:
            score = score+1
            pass
        else:
            pass

        if c4==ans4:
            score = score+1
            fscore.set(score)
        else:
        fscore.set(score)


#frame
frame = Frame(window)
frame.columnconfigure(0, weight=1)
frame.rowconfigure(0, weight=1)

#variables
ans1 = StringVar()
ans2 = StringVar()
ans3 = StringVar()
ans4 = StringVar()
fscore = StringVar()

#labels
q1 = Label(window,text = ques1, height = 3, bg = 'yellow')
q1.grid(row = 1,column=0)

q2 = Label(window,text = ques2, height = 3, bg = 'yellow')
q2.grid(row = 2,column=0)

q3 = Label(window,text = ques3, height = 3, bg = 'yellow')
q3.grid(row = 3,column=0)

q4 = Label(window,text = ques4, height = 3, bg = 'yellow')
q4.grid(row = 4,column=0)

#entrys
q1_entry = Entry(window, width = 6, textvariable = ans1)
q1_entry.grid(row = 1,column=1)

q2_entry = Entry(window, width = 6, textvariable = ans2)
q2_entry.grid(row = 2,column=1)

q3_entry = Entry(window, width = 6, textvariable = ans3)
q3_entry.grid(row = 3,column=1)

q4_entry = Entry(window, width = 6, textvariable = ans4)
q4_entry.grid(row = 4,column=1)

#buttons

finish = Button(window, width = 5, text = "finish",command= save)
finish.grid(row = 5,column=0)

q4 = Label(window,textvariable =fscore)
q4.grid(row = 5,column=1)

这些是我看到的问题:

保存需要参数但收到 none

你通常在Python中定义和调用函数的方式是这样的:

def myFunction( param1, param2 ) :
    print( "param1: {}, param2: {}".format( param1, param2 )

myFunction( 10, named_param="hello" ) # Outputs "param1: 10, param2: hello"

您向该函数传递了一组该函数的局部参数。调用函数时设置参数,函数returns时释放参数。参数允许您更改函数在调用之间的运行方式。

您是这样定义 save 函数的:

score = 0
def save( score ) :
    ...

这里你在定义函数之前定义了一个变量score。当你给你的 save 函数一个 score 参数时,它有效地隐藏了原来的 score 变量。现在,无论何时从 save 内部访问 score,您都在访问仅在函数为 运行ning 时定义的局部变量。

问题是它期望调用它的任何东西都给它一个 score 的值。它不会将其参数 score 与您定义的变量相关联。对于所有密集的目的,它们是单独的对象。你想要做什么,而不是给你的函数一个参数,是这样的:

def save() :
    score = 0

这里我们在save函数中定义了一个名为score的局部变量。这个变量是在函数内部定义的,在函数returns时被销毁,就像参数一样,但它总是初始化为0。另外,我们不必告诉函数[=19=的值是什么] 是。它已经知道分数从 0 开始。

为什么之前的实现会报错? tkinter.Button 的命令参数采用函数变量,而不是函数调用。它调用你的函数的方式是你无法控制的,它不会向函数传递任何参数。有多种方法可以绕过此限制,但您不需要这样做,因为 score 的初始值不应在调用之间更改。

保存函数中的无限循环永远不会结束

while True: 是一个无限循环。除非以 breakreturn 或其他终止执行的语句明确结束,否则它将永远 运行 继续而不执行代码的任何其他部分。

您的代码不需要 while True: 行来执行。我建议删除它,因为您不需要循环函数中的任何内容。

不必要的else和pass语句

您不需要为每个 if 语句指定一个 else 条件。您也不需要在每个 if 语句的末尾使用 pass。你应该这样写你的陈述:

if c1 == ans1:
    score = score + 1

pass 什么都不做。它主要用于填充 space 预期但未给出的语句,例如,作为您尚未编写的函数中的占位符。 elseif 语句的计算结果为 False 且不需要时调用。除非您想对所有其他情况做某事,否则不要只将 else 块添加到 if 语句。

您可以在此处看到其中一个引入的问题:

    if c4==ans4:
        score = score+1
        fscore.set(score)
    else:
        fscore.set(score)

除了像这样写这个块,你可以这样写:

    if c4==ans4:
        score = score+1
    fscore.set(score)

fscore.set 将始终在这里调用。尝试尽量减少代码并巩固您的条件。将来,如果您希望该函数在获得玩家分数后执行更多操作,那么将它添加到函数的末尾会更容易,而不是跟踪所有控制路径并确保一切都以相同的方式运行.

使用 get 获取条目的实际值

您的程序设置方式永远不会得分,因为您永远不会访问输入字段的实际文本值。看这一行:

if c1==ans1:

虽然您认为这是将 ans1 的文本值与 c1 进行比较,但它所做的是将 TK 变量与数字进行比较,该数字始终为 False。您需要获取条目的值,然后将其转换为数字(从字符串)以获得您想要的结果:

if c1==int(ans1.get()):

为什么我们需要使用get方法?因为 ans1 持有 TextVariable 对象。它可以做很多事情,但由于它的实现方式,您必须从中提取价值。否则你试图比较两种不同类型的对象,这是行不通的。

为什么我们需要使用int功能?因为 c1 是一个整数,但是 ans1.get() 给了我们一个字符串。在 Python 中,您必须将字符串转换为其整数值才能使比较有效。换句话说,10 != "10".