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