我正在尝试使用tkinter在python中创建GPA计算器。我正在使用python 3.1。 继承了我到目前为止我的GUI。
root = Tk()
root.title('GPA Calculator')
#create frames
self.column_headers = Frame(root)
self.class1_frame = Frame(root)
self.class2_frame = Frame(root)
self.class3_frame = Frame(root)
self.class4_frame = Frame(root)
self.enterClasses_frame= Frame(root)
self.deposit_frame = Frame(root)
self.column_header = Label(self.column_headers, \
text = 'Credit Hours Grade',fg = 'black')
self.column_header.pack(side = 'left')
self.class1label = Label(self.class1_frame, \
text = 'Class 1:', fg = 'black')
self.class1label.pack(side = 'left')
self.creditHours1 = Entry(self.class1_frame)
self.creditHours1.pack(side = 'left')
self.grade1 = Entry(self.class1_frame)
self.grade1.pack(side = 'left')
self.class2label = Label(self.class2_frame, \
text = 'Class 2:', fg = 'black')
self.class2label.pack(side = 'left')
self.creditHours2 = Entry(self.class2_frame)
self.creditHours2.pack(side = 'left')
self.grade2 = Entry(self.class2_frame)
self.grade2.pack(side = 'left')
self.class3label = Label(self.class3_frame, \
text = 'Class 3:', fg = 'black')
self.class3label.pack(side = 'left')
self.creditHours3 = Entry(self.class3_frame)
self.creditHours3.pack(side = 'left')
self.grade3 = Entry(self.class3_frame)
self.grade3.pack(side = 'left')
self.class4label = Label(self.class4_frame, \
text = 'Class 4:', fg = 'black')
self.class4label.pack(side = 'left')
self.creditHours4 = Entry(self.class4_frame)
self.creditHours4.pack(side = 'left')
self.grade4 = Entry(self.class4_frame)
self.grade4.pack(side = 'left')
self.enterClasses = Button(self.enterClasses_frame, text = 'Submit Classes',bg = 'blue',\
fg = 'white')
self.enterClasses.pack(side = 'left')
#pack frames
self.column_headers.pack()
self.class1_frame.pack()
self.class2_frame.pack()
self.class3_frame.pack()
self.class4_frame.pack()
self.enterClasses_frame.pack()
root.mainloop()
我想这样对于成绩我有一个下拉框或类似的东西,可以让他们选择他们的成绩,如A,A-,B +,B等等。
我做了很多研究,虽然我稍微谈了一下,但我不知道如何将它合并到我的GUI中。
非常感谢任何帮助,提前谢谢。
答案 0 :(得分:3)
所以,我完全同意jon_darkstar关于不对课程进行硬编码的意见。这看起来像是它自己的类的主要候选者(在编程概念意义上)。
但是,要用下拉列表替换您的输入框(称为* OptionMenu * s),您需要执行以下操作:
self.class1label = Label(self.class1_frame, \
text = 'Class 1:', fg = 'black')
self.class1label.pack(side = 'left')
self.creditHours1 = Entry(self.class1_frame)
self.creditHours1.pack(side = 'left')
#self.grade1 = Entry(self.class1_frame)
#self.grade1.pack(side = 'left')
self.grade1 = StringVar(root)
self.grade1.set(" ")
self.g1opt = OptionMenu(self.class1_frame, self.grade1, *GRADES)
self.g1opt.pack(side = 'right')
请注意,我注释了您的输入行并在下面添加了我自己的。
另外,我在将其引用为:
之前定义了GRADESGRADES = ["A","B","C","D","F"]
但您可以修改它以满足您的需求(+/-等级等)。
您还应考虑创建一个回调函数,该函数在用户更改下拉列表的值时调用(或打开下拉列表并重新选择当前选择)。你可以先创建一个回调函数,例如
def dd_cb(selected):
print("Dropdown Callback: ", selected)
然后将上一节中的倒数第二行编辑为每个课程的以下内容:
self.g1opt = OptionMenu(self.class1_frame, self.grade1, *GRADES, command=dd_cb)
我应该指出,您将无法通过这种方式检测哪个下拉列表已被更改,因此这是使这些单独的行成为类的实例的另一个原因。如果你这样做,你会写一些类似的东西:
self.g1opt = OptionMenu(self.class1_frame, self.grade1, *GRADES, command=self.dd_cb)
代替。
让你开始走向每个课程,成为一个班级的实例。
<强> gpacalc.py 强>
from tkinter import *
import Course
class App(object):
def __init__(self):
root = Tk()
root.title('GPA Calculator')
self.column_headers = Frame(root)
self.enterClasses_frame= Frame(root)
self.deposit_frame = Frame(root)
self.column_header = Label(self.column_headers, \
text = 'Credit Hours Grade',fg = 'black')
self.column_header.pack(side = 'left')
self.enterClasses = Button(self.enterClasses_frame, text='Submit Classes', bg='blue',\
fg='white')
self.enterClasses.pack(side = 'left')
# Define the number of Courses -- eventually, you might want to make this user-editable
NUM_COURSES = 4
# Create Courses
self.courses = list()
for i in range(1, NUM_COURSES+1):
self.courses.append(Course.Course(root, i))
# Pack Frames
self.column_headers.pack()
for c in self.courses:
c.pack()
self.enterClasses_frame.pack()
root.mainloop()
a = App()
<强> Course.py 强>
import tkinter
GRADES = ["A","B","C","D","F"]
class Course(object):
def __init__(self, root, course_id):
# Store Course ID
self.course_id = course_id
# Create Frame
self.frame = tkinter.Frame(root)
# Create Label
self.label = tkinter.Label(self.frame, text = ('Class %d:' % course_id), fg = 'black')
self.label.pack(side = 'left')
# Create Credit Hours Entry
self.hours = tkinter.Entry(self.frame)
self.hours.pack(side = 'left')
# Create Grade Dropdown
self.grade = tkinter.StringVar(root)
self.grade.set(" ")
self.gopt = tkinter.OptionMenu(self.frame, self.grade, *GRADES, command=self.dd_cb)
self.gopt.pack(side = 'left')
def dd_cb(self, selected):
print("Course %d Dropdown Event: %s" % (self.course_id, selected))
def pack(self):
self.frame.pack()
这里有几点需要注意:
1)现在,回调将能够判断哪个下拉列表已更改。尝试一下,你应该得到如下输出:
Course 1 Dropdown Event: A
Course 2 Dropdown Event: B
Course 3 Dropdown Event: C
2)您可以通过编辑NUM_COURSES变量来更改课程数量。
3)这并不完美,而且我做了很多调整 - 但如果你打算通过制作每门课程和课程实例来清理你的代码,这会让你走上正确的方向。
(赞成新编辑赞成)