我正在为我的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)
这些是我看到的问题:
保存需要参数,但不接收任何参数
在Python中通常定义和调用函数的方式如下:
向函数中传递一组该函数的局部参数。当函数被调用时,参数被设置,当函数返回时,参数被释放。参数允许您更改函数在调用之间的操作方式。你知道吗
以下是定义
save
函数的方法:在这里,在定义函数之前定义了一个变量
score
。当您给save
函数一个score
参数时,它实际上隐藏了原始的score
变量。现在,无论何时从save
内部访问score
,都是在访问仅在函数运行时定义的局部变量。你知道吗问题是,它希望调用它的任何东西都为
score
提供一个值。它不会将其参数score
与您定义的变量相关联。出于所有的目的,它们都是独立的对象。您要做的不是给函数一个参数,而是:这里我们在
save
函数中定义一个名为score
的局部变量。此变量在函数内部定义,并在函数返回时销毁,如参数,但它始终初始化为0。此外,我们不必告诉函数score
的值是什么。它已经知道分数从0开始。你知道吗为什么早期的实现会给我们一个错误?
tkinter.Button
的命令参数采用函数变量,而不是函数调用。它调用函数的方式超出了您的控制,它不会向函数传递任何参数。有一些方法可以绕过这个限制,但您不需要这样做,因为score
的初始值在调用之间不应该改变。你知道吗保存函数中的无限循环永不结束
while True:
是一个无限循环。除非以break
、return
或其他终止执行的语句显式结束,否则它将永远继续运行,而不会执行代码的任何其他部分。你知道吗执行代码不需要
while True:
行。我建议删除它,因为您不需要在函数中循环任何内容。你知道吗不必要的else和pass语句
不需要为每个
if
语句指定else
条件。您也不需要在每个if
语句的末尾使用pass
。你应该这样写你的陈述:pass
什么也不做。它主要用于填充期望语句但未给定语句的空间,例如,作为尚未编写的函数中的占位符。^当if
语句的计算结果为False
时,{if
语句中添加一个else
块。你知道吗您可以看到这里介绍的一个问题:
你可以这样写,而不是这样写这个块:
fscore.set
将始终在此处调用。尝试最小化代码并整合您的条件。在将来,如果你想让函数在得到玩家的分数后做更多的事情,那就更容易添加到函数的末尾,而不是跟踪所有的控制路径,确保所有的操作都是一样的。你知道吗使用get获取条目的实际值
按照程序的设置方式,您永远不会得分,因为您永远不会访问输入字段的实际文本值。看这一行:
当您认为这是比较
ans1
和c1
的文本值时,它所做的是将TK变量与一个数字进行比较,而这个数字总是错误的。你需要得到输入项的值,然后将其转换为数字(从字符串)以获得所需的结果:为什么我们需要使用
get
方法?因为ans1持有TextVariable对象。它有很多功能,但是由于它的实现方式,您必须从中提取价值。否则,您将尝试比较两种不同类型的对象,这是行不通的。你知道吗为什么我们需要使用
int
函数?因为c1
是一个整数,但是ans1.get()
给了我们一个字符串。在Python中,为了使比较有效,必须将字符串转换为其整数值。换句话说,10 != "10"
。你知道吗相关问题 更多 >
编程相关推荐