def的括号里应该放什么?

2024-03-29 08:18:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在为我的GCSE计算机程序做一个程序。这个项目是为一所小学准备的。 这是一个有乘法问题的测试,它应该在最后生成一个最终分数

我用tkinter来创建程序,一切正常,但当我创建def来生成分数时,它却没有工作。什么时候我运行我的程序,它的罚款,但我填写了测验,并点击完成按钮,它开始加载,给我一个错误,程序不能运行。 我想问题出在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)

Tags: textcolumnpasswindowlabelgridrowscore
1条回答
网友
1楼 · 发布于 2024-03-29 08:18:23

这些是我看到的问题:

保存需要参数,但不接收任何参数

在Python中通常定义和调用函数的方式如下:

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

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

向函数中传递一组该函数的局部参数。当函数被调用时,参数被设置,当函数返回时,参数被释放。参数允许您更改函数在调用之间的操作方式。你知道吗

以下是定义save函数的方法:

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

在这里,在定义函数之前定义了一个变量score。当您给save函数一个score参数时,它实际上隐藏了原始的score变量。现在,无论何时从save内部访问score,都是在访问仅在函数运行时定义的局部变量。你知道吗

问题是,它希望调用它的任何东西都为score提供一个值。它不会将其参数score与您定义的变量相关联。出于所有的目的,它们都是独立的对象。您要做的不是给函数一个参数,而是:

def save() :
    score = 0

这里我们在save函数中定义一个名为score的局部变量。此变量在函数内部定义,并在函数返回时销毁,如参数,但它始终初始化为0。此外,我们不必告诉函数score的值是什么。它已经知道分数从0开始。你知道吗

为什么早期的实现会给我们一个错误?tkinter.Button的命令参数采用函数变量,而不是函数调用。它调用函数的方式超出了您的控制,它不会向函数传递任何参数。有一些方法可以绕过这个限制,但您不需要这样做,因为score的初始值在调用之间不应该改变。你知道吗

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

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

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

不必要的else和pass语句

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

if c1 == ans1:
    score = score + 1

pass什么也不做。它主要用于填充期望语句但未给定语句的空间,例如,作为尚未编写的函数中的占位符。^当if语句的计算结果为False时,{}被调用,这不是必需的。除非您想为所有其他情况做些什么,否则不要只在if语句中添加一个else块。你知道吗

您可以看到这里介绍的一个问题:

    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:

当您认为这是比较ans1c1的文本值时,它所做的是将TK变量与一个数字进行比较,而这个数字总是错误的。你需要得到输入项的值,然后将其转换为数字(从字符串)以获得所需的结果:

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

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

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

相关问题 更多 >