Python中的GPA计算器程序,带有tkinter GUI

时间:2011-05-05 05:20:34

标签: python tkinter

我正在尝试使用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中。

非常感谢任何帮助,提前谢谢。

1 个答案:

答案 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')

请注意,我注释了您的输入行并在下面添加了我自己的。

另外,我在将其引用为:

之前定义了GRADES
GRADES = ["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)这并不完美,而且我做了很多调整 - 但如果你打算通过制作每门课程和课程实例来清理你的代码,这会让你走上正确的方向。

(赞成新编辑赞成)