【问题标题】:Used a for loop to create a certain number of entry boxes but can only .get last value from last entrybox使用 for 循环创建一定数量的输入框,但只能从最后一个输入框获取最后一个值
【发布时间】:2014-01-18 21:42:09
【问题描述】:

我是 Python 新手,我正在尝试使用 tkinter 创建一个简单的成绩计算器。 我使用循环来创建用户定义的多个输入框——用于输入成绩。 但是,我不知道如何使这些输入框值的名称返回列表或其他内容中的所有值。 (到目前为止程序只返回最后一个输入框中输入的最后一个值)。 我不确定要包含多少信息,所以我将简要说明我正在尝试做的事情:

1 使用循环创建用户定义的 X 个输入框

2 位用户输入成绩

3 以及每个年级的百分比价值

4 然后我想访问每个单独的成绩以将其乘以百分比

5 然后得到总和。

*到目前为止我所写的内容不包括为百分比创建输入框,因为我一直专注于试图让我的程序返回所有成绩。

这是我认为可能存在问题的代码部分。

    self.abutton=tkinter.Button(self.Frame3,text="Average",command=self.getValues)
    self.abutton.pack(side='right')



def myClick(self):      
    self.x=self.myvalue.get()
    self.value=int(self.x)
    for n in range(self.value):
            self.Mylabel=Label(self.Frame2,text="Grade"+str(n+1)).place(x=10,y=30+(30*n))         
            self.Mygrade= Entry(self.Frame2, width=10)
            self.Mygrade.place(x=70,y=30+(30*n))







def getValues(self):
    self.test1 = ()
    nsum=0
    try:
        self.test1 = float(self.Mygrade.get())
    except ValueError:
        print("Error")
    else:
        print(self.test1)

我也在这里粘贴了整个代码:http://pastebin.com/xC92BKeb

另外,请原谅我在整个粘贴箱中为自己留下的任何杂散笔记,我忘了把它们放在外面。

如果我能提供任何关于我做错了什么以及我应该做什么的信息和/或批评,我将不胜感激。

【问题讨论】:

  • 忘了包括,我使用的是 Python v3.3
  • 这里有一个(温和的)批评:不要使用 place。如果您使用网格和/或打包,您的 GUI 将更易于编写和维护,并且在调整大小或在不同分辨率或不同字体上运行时会有更好的行为。 .

标签: python list loops tkinter python-3.3


【解决方案1】:

myClick 方法中,self.Mygrade 被最后一个条目覆盖。

self.Mygrade= Entry(self.Frame2, width=10)

而在getValues 中,只使用了一个值。

self.test1 = float(self.Mygrade.get())

您应该使用一些容器数据结构(例如list)来保留对Entry 对象的引用,并使用该列表来计算平均值。


def myClick(self):      
    x = self.myvalue.get()
    value = int(x)
    self.grades = [] # <---- to hold grade Entry objects.
    for n in range(self.value):
        Label(self.Frame2,text="Grade"+str(n+1)).place(x=10,y=30+(30*n))        
        grade = Entry(self.Frame2, width=10)
        grade.place(x=70,y=30+(30*n))
        self.grades.append(grade) # <---

def getValues(self):
    total = 0
    for grade in self.grades: # <--- iterate over entry objects.
        try:
            total += float(grade.get())
        except ValueError:
            print('Invalid value for grade: {}'.format(grade.get()))
    avg = total / len(self.grades)
    print('Average = {}'.format(avg))

【讨论】:

  • 非常感谢!我仍然无法理解问题,但我刚刚尝试了你的代码,我很高兴我有工作代码可以与我的代码进行比较,我希望以这种方式了解我哪里出错了。非常感谢!
猜你喜欢
  • 1970-01-01
  • 2015-04-08
  • 2018-12-29
  • 2019-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-13
  • 1970-01-01
相关资源
最近更新 更多