Программа GPA Calculator на Python с графическим интерфейсом tkinter - PullRequest
0 голосов
/ 05 мая 2011

Я пытаюсь создать калькулятор GPA в python, используя tkinter. Я использую 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 и т. Д. И т. Д.

Я провел много исследований, и хотя я немного их затронул, я понятия не имею, как включить его в свой графический интерфейс.

Любая помощь будет принята с благодарностью, заранее спасибо.

1 Ответ

3 голосов
/ 05 мая 2011

Итак, я полностью согласен с 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) Это не идеально, и я гораздо больше настраиваю - но это поможет вам в правильном направлении, если вы собираетесь очистить свой код, создавая каждый курс и экземпляр класса.

(благодарность за новый редактор приветствуется)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...