class Character_Creator: def __init__(self): self.character = Character() self.tuples = Character_Tuples() self.skillCount = 0 self.mainHandTuple = self.tuples.BARBARIAN_MAIN_HAND self.offHandTuple = self.tuples.BARBARIAN_OFF_HAND self.rangedTuple = self.tuples.BARBARIAN_RANGED_WEAPON self.armorTuple = self.tuples.BARBARIAN_ARMOR def pointBuyCallback(self, statIndex, additionMode): """ Callback for the increment buttons that checks if the amount of points after the increment would be negative then if negative makes the increment button inactive and if not negative increments the label for the respective stat and subtracts from the available point total :param statPage: :param statCharacter: :param statIndex: :return: """ # True triggers addition if additionMode: self.character.Increment(statIndex) self.pointsTotalLabel.config(text=self.character.points) self.statLabelList[statIndex].config(text=self.character.stats[statIndex]) self.statModList[statIndex].config(text=self.strFormat(self.character.modifiers[statIndex])) self.minusButtonList[statIndex].config(state='active') for i in range(len(self.tuples.STAT_TUPLE)): if self.character.canIncrement(i) == False: self.plusButtonList[i].config(state='disabled') self.calculateResults() # False triggers subtraction else: self.character.Decrement(statIndex) self.pointsTotalLabel.config(text=self.character.points) self.statLabelList[statIndex].config(text=self.character.stats[statIndex]) self.statModList[statIndex].config(text=self.strFormat(self.character.modifiers[statIndex])) for i in range(len(self.character.tuples.STAT_TUPLE)): self.plusButtonList[i].config(state='active') if self.character.canDecrement(statIndex) == False: self.minusButtonList[statIndex].config(state='disabled') self.calculateResults() #def statsCallback(self): # statsDict = self.character.assignRandomStats() def calculateResults(self): # Updates information when button Calculate Stats is pressed # Saving throw modifiers for i in range(len(self.tuples.STAT_TUPLE)): self.savingThrowValues[i].config(text=self.strFormat(self.character.modifiers[i])) self.character.assignAC() self.ACValue.config(text=(self.character.armorClass)) self.initiativeValue.config(text=self.strFormat(self.character.modifiers[1])) # Skill checks refresh for i in range(len(self.tuples.SKILLS_TUPLE)): if self.tuples.SKILLS_MOD_TUPLE[i] == 'str': if self.skillVar[i].get() == 1: self.skillsValue[i].config(text=self.strFormat(self.character.modifiers[0] + int(self.proficiencyValue.cget('text')))) else: self.skillsValue[i].config(text=self.strFormat(self.character.modifiers[0])) elif self.tuples.SKILLS_MOD_TUPLE[i] == 'dex': if self.skillVar[i].get() == 1: self.skillsValue[i].config(text=self.strFormat(self.character.modifiers[1] + int(self.proficiencyValue.cget('text')))) else: self.skillsValue[i].config(text=self.strFormat(self.character.modifiers[1])) elif self.tuples.SKILLS_MOD_TUPLE[i] == 'int': if self.skillVar[i].get() == 1: self.skillsValue[i].config(text=self.strFormat(self.character.modifiers[3] + int(self.proficiencyValue.cget('text')))) else: self.skillsValue[i].config(text=self.strFormat(self.character.modifiers[3])) elif self.tuples.SKILLS_MOD_TUPLE[i] == 'wis': if self.skillVar[i].get() == 1: self.skillsValue[i].config(text=self.strFormat(self.character.modifiers[4] + int(self.proficiencyValue.cget('text')))) else: self.skillsValue[i].config(text=self.strFormat(self.character.modifiers[4])) elif self.tuples.SKILLS_MOD_TUPLE[i] == 'cha': if self.skillVar[i].get() == 1: self.skillsValue[i].config(text=self.strFormat(self.character.modifiers[5] + int(self.proficiencyValue.cget('text')))) else: self.skillsValue[i].config(text=self.strFormat(self.character.modifiers[5])) self.perceptionValue.config(text=self.strFormat(self.character.modifiers[4])) def calculateStatsLevel(self, selected): # Proficiency modifier changes self.proficiencyValue.config(text=self.strFormat(self.tuples.PROFICIENCY_TUPLE[selected-1])) self.calculateHP() def calculateStatsRace(self, selected): self.character.setRace(selected) for i in range(len(self.tuples.STAT_TUPLE)): self.character.adjustModifiers(i) self.calculateResults() self.calculateHP() if selected == 'Dwarf': for i in range(len(self.tuples.STAT_TUPLE)): self.statRaceList[i].config(text='+%d' % self.tuples.DWARF_TUPLE[i]) elif(selected == 'Elf'): for i in range(len(self.tuples.STAT_TUPLE)): self.statRaceList[i].config(text='+%d' % self.tuples.ELF_TUPLE[i]) elif(selected == 'Halfling'): for i in range(len(self.tuples.STAT_TUPLE)): self.statRaceList[i].config(text='+%d' % self.tuples.HALFLING_TUPLE[i]) elif(selected == 'Human'): for i in range(len(self.tuples.STAT_TUPLE)): self.statRaceList[i].config(text='+%d' % self.tuples.HUMAN_TUPLE[i]) elif(selected == 'Dragonborn'): for i in range(len(self.tuples.STAT_TUPLE)): self.statRaceList[i].config(text='+%d' % self.tuples.DRAGONBORN_TUPLE[i]) elif(selected == 'Gnome'): for i in range(len(self.tuples.STAT_TUPLE)): self.statRaceList[i].config(text='+%d' % self.tuples.GNOME_TUPLE[i]) elif(selected == 'Half-Elf'): # Half-Elf is tricky because it lets you choose two score to increase. For now, the program will increase # Dex and Con for i in range(len(self.tuples.STAT_TUPLE)): self.statRaceList[i].config(text='+%d' % self.tuples.HALFELF_TUPLE[i]) elif(selected == 'Half-Orc'): for i in range(len(self.tuples.STAT_TUPLE)): self.statRaceList[i].config(text='+%d' % self.tuples.HALFORC_TUPLE[i]) elif(selected == 'Tiefling'): for i in range(len(self.tuples.STAT_TUPLE)): self.statRaceList[i].config(text='+%d' % self.tuples.TIEFLING_TUPLE[i]) # This code will refresh the display on the modifiers when a race is chosen for i in range(len(self.tuples.STAT_TUPLE)): self.statModList[i].config(text=self.character.modifiers[i]) if selected == 'Dwarf' or selected == 'Gnome' or selected == 'Halfling': self.speedValue.config(text='20ft.') else: self.speedValue.config(text='30ft.') def skillCallback(self, index): tempClass = self.classVar.get() if tempClass == 'Barbarian': if self.skillVar[index].get() == 1: self.skillCount += 1 if self.skillCount > 1: for i in range(len(self.tuples.SKILLS_TUPLE)): if self.skillVar[i].get() == 0: self.skillBoxes[i].config(state='disabled') else: self.skillCount = self.skillCount - 1 for i in range(len(self.tuples.BARBARIAN_TUPLE)): self.skillBoxes[self.tuples.BARBARIAN_TUPLE[i]].config(state='normal') elif tempClass == 'Bard': if self.skillVar[index].get() == 1: self.skillCount += 1 if self.skillCount > 2: for i in range(len(self.tuples.SKILLS_TUPLE)): if self.skillVar[i].get() == 0: self.skillBoxes[i].config(state='disabled') else: self.skillCount = self.skillCount - 1 for i in range(len(self.tuples.BARD_TUPLE)): self.skillBoxes[self.tuples.BARD_TUPLE[i]].config(state='normal') elif tempClass == 'Cleric': if self.skillVar[index].get() == 1: self.skillCount += 1 if self.skillCount > 1: for i in range(len(self.tuples.SKILLS_TUPLE)): if self.skillVar[i].get() == 0: self.skillBoxes[i].config(state='disabled') else: self.skillCount = self.skillCount - 1 for i in range(len(self.tuples.CLERIC_TUPLE)): self.skillBoxes[self.tuples.CLERIC_TUPLE[i]].config(state='normal') elif tempClass == 'Druid': if self.skillVar[index].get() == 1: self.skillCount += 1 if self.skillCount > 1: for i in range(len(self.tuples.SKILLS_TUPLE)): if self.skillVar[i].get() == 0: self.skillBoxes[i].config(state='disabled') else: self.skillCount = self.skillCount - 1 for i in range(len(self.tuples.DRUID_TUPLE)): self.skillBoxes[self.tuples.DRUID_TUPLE[i]].config(state='normal') elif tempClass == 'Fighter': if self.skillVar[index].get() == 1: self.skillCount += 1 if self.skillCount > 1: for i in range(len(self.tuples.SKILLS_TUPLE)): if self.skillVar[i].get() == 0: self.skillBoxes[i].config(state='disabled') else: self.skillCount = self.skillCount - 1 for i in range(len(self.tuples.FIGHTER_TUPLE)): self.skillBoxes[self.tuples.FIGHTER_TUPLE[i]].config(state='normal') elif tempClass == 'Monk': if self.skillVar[index].get() == 1: self.skillCount += 1 if self.skillCount > 1: for i in range(len(self.tuples.SKILLS_TUPLE)): if self.skillVar[i].get() == 0: self.skillBoxes[i].config(state='disabled') else: self.skillCount = self.skillCount - 1 for i in range(len(self.tuples.MONK_TUPLE)): self.skillBoxes[self.tuples.MONK_TUPLE[i]].config(state='normal') elif tempClass == 'Paladin': if self.skillVar[index].get() == 1: self.skillCount += 1 if self.skillCount > 1: for i in range(len(self.tuples.SKILLS_TUPLE)): if self.skillVar[i].get() == 0: self.skillBoxes[i].config(state='disabled') else: self.skillCount = self.skillCount - 1 for i in range(len(self.tuples.PALADIN_TUPLE)): self.skillBoxes[self.tuples.PALADIN_TUPLE[i]].config(state='normal') elif tempClass == 'Ranger': if self.skillVar[index].get() == 1: self.skillCount += 1 if self.skillCount > 2: for i in range(len(self.tuples.SKILLS_TUPLE)): if self.skillVar[i].get() == 0: self.skillBoxes[i].config(state='disabled') else: self.skillCount = self.skillCount - 1 for i in range(len(self.tuples.RANGER_TUPLE)): self.skillBoxes[self.tuples.RANGER_TUPLE[i]].config(state='normal') elif tempClass == 'Rogue': if self.skillVar[index].get() == 3: self.skillCount += 1 if self.skillCount > 1: for i in range(len(self.tuples.SKILLS_TUPLE)): if self.skillVar[i].get() == 0: self.skillBoxes[i].config(state='disabled') else: self.skillCount = self.skillCount - 1 for i in range(len(self.tuples.ROGUE_TUPLE)): self.skillBoxes[self.tuples.ROGUE_TUPLE[i]].config(state='normal') elif tempClass == 'Sorcerer': if self.skillVar[index].get() == 1: self.skillCount += 1 if self.skillCount > 1: for i in range(len(self.tuples.SKILLS_TUPLE)): if self.skillVar[i].get() == 0: self.skillBoxes[i].config(state='disabled') else: self.skillCount = self.skillCount - 1 for i in range(len(self.tuples.SORCERER_TUPLE)): self.skillBoxes[self.tuples.SORCERER_TUPLE[i]].config(state='normal') elif tempClass == 'Warlock': if self.skillVar[index].get() == 1: self.skillCount += 1 if self.skillCount > 1: for i in range(len(self.tuples.SKILLS_TUPLE)): if self.skillVar[i].get() == 0: self.skillBoxes[i].config(state='disabled') else: self.skillCount = self.skillCount - 1 for i in range(len(self.tuples.WARLOCK_TUPLE)): self.skillBoxes[self.tuples.WARLOCK_TUPLE[i]].config(state='normal') elif tempClass == 'Wizard': if self.skillVar[index].get() == 1: self.skillCount += 1 if self.skillCount > 1: for i in range(len(self.tuples.SKILLS_TUPLE)): if self.skillVar[i].get() == 0: self.skillBoxes[i].config(state='disabled') else: self.skillCount = self.skillCount - 1 for i in range(len(self.tuples.WIZARD_TUPLE)): self.skillBoxes[self.tuples.WIZARD_TUPLE[i]].config(state='normal') self.calculateResults() def calculateClass(self, value): self.skillCount = 0 self.resetGearLists() for i in range(len(self.tuples.SKILLS_TUPLE)): self.skillVar[i].set(0) self.skillBoxes[i].config(state='disabled') self.calculateHP() if self.classVar.get() == 'Barbarian': for i in range(len(self.tuples.BARBARIAN_TUPLE)): self.skillBoxes[self.tuples.BARBARIAN_TUPLE[i]].config(state='normal') self.HPDiceValue.config(text='1d12') if self.classVar.get() == 'Bard': for i in range(len(self.tuples.BARD_TUPLE)): self.skillBoxes[self.tuples.BARD_TUPLE[i]].config(state='normal') self.HPDiceValue.config(text='1d8') if self.classVar.get() == 'Cleric': for i in range(len(self.tuples.CLERIC_TUPLE)): self.skillBoxes[self.tuples.CLERIC_TUPLE[i]].config(state='normal') self.HPDiceValue.config(text='1d8') if self.classVar.get() == 'Druid': for i in range(len(self.tuples.DRUID_TUPLE)): self.skillBoxes[self.tuples.DRUID_TUPLE[i]].config(state='normal') self.HPDiceValue.config(text='1d8') if self.classVar.get() == 'Fighter': for i in range(len(self.tuples.FIGHTER_TUPLE)): self.skillBoxes[self.tuples.FIGHTER_TUPLE[i]].config(state='normal') self.HPDiceValue.config(text='1d10') if self.classVar.get() == 'Monk': for i in range(len(self.tuples.MONK_TUPLE)): self.skillBoxes[self.tuples.MONK_TUPLE[i]].config(state='normal') self.HPDiceValue.config(text='1d8') if self.classVar.get() == 'Paladin': for i in range(len(self.tuples.PALADIN_TUPLE)): self.skillBoxes[self.tuples.PALADIN_TUPLE[i]].config(state='normal') self.HPDiceValue.config(text='1d10') if self.classVar.get() == 'Ranger': for i in range(len(self.tuples.RANGER_TUPLE)): self.skillBoxes[self.tuples.RANGER_TUPLE[i]].config(state='normal') self.HPDiceValue.config(text='1d10') if self.classVar.get() == 'Rogue': for i in range(len(self.tuples.ROGUE_TUPLE)): self.skillBoxes[self.tuples.ROGUE_TUPLE[i]].config(state='normal') self.HPDiceValue.config(text='1d8') if self.classVar.get() == 'Sorcerer': for i in range(len(self.tuples.SORCERER_TUPLE)): self.skillBoxes[self.tuples.SORCERER_TUPLE[i]].config(state='normal') self.HPDiceValue.config(text='1d6') if self.classVar.get() == 'Warlock': for i in range(len(self.tuples.WARLOCK_TUPLE)): self.skillBoxes[self.tuples.WARLOCK_TUPLE[i]].config(state='normal') self.HPDiceValue.config(text='1d8') if self.classVar.get() == 'Wizard': for i in range(len(self.tuples.WIZARD_TUPLE)): self.skillBoxes[self.tuples.WIZARD_TUPLE[i]].config(state='normal') self.HPDiceValue.config(text='1d6') def calculateHP(self): temp = self.classVar.get() level = int(self.levelVar.get()) if temp == 'Barbarian': self.HPValue.config(text=str(12 + ((7 + self.character.modifiers[2]) * (level - 1)) + self.character.modifiers[2])) elif temp == 'Fighter' or temp == 'Paladin' or temp == 'Ranger': self.HPValue.config(text=str(10 + ((6 + self.character.modifiers[2]) * (level - 1)) + self.character.modifiers[2])) elif temp == 'Sorcerer' or temp == 'Wizard': self.HPValue.config(text=str(6 + ((4 + self.character.modifiers[2]) * (level - 1)) + self.character.modifiers[2])) else: self.HPValue.config(text=str(8 + ((5 + self.character.modifiers[2]) * (level - 1)) + self.character.modifiers[2])) def resetGearLists(self): self.mainHandVar.set('Unarmed') self.offHandVar.set('Unarmed') self.armorVar.set('No armor') def strFormat(self, statMod): # Formats the modfifier value into a string if positive of the form '+%d' or an intger if it's negative if statMod < 0: return statMod else: return '+%d' % statMod def statFrameDisplay(self): # Stats frame of the window self.statPage = Frame(self.root, padding=12) self.statPage.grid(row=0, column=0, sticky=(N, W)) self.statPage.rowconfigure(0, weight=1) self.statPage.columnconfigure(0, weight=1) # List of labels for stats such as Strength and Dexterity Label(self.statPage, text='Stats:').grid(row=0, column=0) Label(self.statPage, text='Race Bonus:').grid(row=0, column=2) Label(self.statPage, text='Modifiers:').grid(row=0, column=3) self.statLabelList = [Label(self.statPage, text=8, width=2) for i in range(len(self.tuples.STAT_TUPLE))] for i in range(len(self.tuples.STAT_TUPLE)): self.statLabelList[i].grid(row=(i + 1), column=1, sticky=W) self.statRaceList = [Label(self.statPage, text='+0', width=3) for i in range(len(self.tuples.STAT_TUPLE))] for i in range(len(self.tuples.STAT_TUPLE)): self.statRaceList[i].grid(row=(i + 1), column=2) self.statModList = [Label(self.statPage, text='-1') for i in range(len(self.tuples.STAT_TUPLE))] for i in range(len(self.tuples.STAT_TUPLE)): self.statModList[i].grid(row=(i + 1), column=3) [Label(self.statPage, text=self.tuples.STAT_TUPLE[i]).grid(row=(i + 1), sticky=W) for i in range(len(self.tuples.STAT_TUPLE))] self.levelLabel = Label(self.statPage, text='Level:') self.levelVar = StringVar(self.statPage) self.levelVar.set('1') self.levelOption = OptionMenu(self.statPage, self.levelVar, *self.tuples.LEVEL_TUPLE, command=self.calculateStatsLevel) self.levelLabel.grid(row=3, column=6) self.levelOption.grid(row=3, column=7, sticky='W') self.pointsTextLabel = Label(self.statPage, text='Available Points:') self.pointsTotalLabel = Label(self.statPage, text=self.character.points) # Displays available points for point buy self.pointsTextLabel.grid(row=4, column=6, columnspan=2) self.pointsTotalLabel.grid(row=5, column=6, columnspan=2) # Displays the increment and decrement buttons for point buy self.minusButtonList = [Button(self.statPage, text='-', command=lambda i=i: self.pointBuyCallback(i, False), state='disabled', width=2) for i in range(len(self.tuples.STAT_TUPLE))] for i in range(len(self.tuples.STAT_TUPLE)): self.minusButtonList[i].grid(row=(i+1), column=4) self.plusButtonList = [Button(self.statPage, text='+', command=lambda i=i: self.pointBuyCallback(i, True), width=2) for i in range(len(self.tuples.STAT_TUPLE))] for i in range(len(self.tuples.STAT_TUPLE)): self.plusButtonList[i].grid(row=(i+1), column=5) #for i in range(len(self.character.STAT_TUPLE)): #self.plusButtonList[i].config(command=lambda: self.pointAddCallback(i)) self.classVar = StringVar(self.statPage) self.classVar.set('Pick class') self.classOption = OptionMenu(self.statPage, self.classVar, *self.tuples.CLASS_TUPLE, command=self.calculateClass) self.classOption.config(width=len(self.tuples.CLASS_TUPLE[0])) self.raceVar = StringVar(self.statPage) self.raceVar.set('Pick race') self.raceOption = OptionMenu(self.statPage, self.raceVar, *self.tuples.RACE_TUPLE, command=self.calculateStatsRace) self.raceOption.config(width=len(self.tuples.RACE_TUPLE[0])) # Displays the optionboxes for classes and races self.classOption.grid(row=1, column=6, columnspan=2) self.raceOption.grid(row=2, column=6, columnspan=2) #Button(self.statPage, text='Calculate stats', command=lambda: self.calculateCallback()).grid(row=7, sticky=W) self.attackLabel = Label(self.statPage, text='Attack Bonus:').grid(row=6, column=6, columnspan=2) # Write labels for each weapon's attack bonus # Weapon portion of the sheet # Main hand weapon self.mainHandLabel = Label(self.statPage, text='Main hand:').grid(row=7, column=0, sticky='W') self.mainHandVar = StringVar(self.statPage) self.mainHandVar.set('Choose a weapon') self.mainHandMenu = OptionMenu(self.statPage, self.mainHandVar, *self.mainHandTuple) self.mainHandMenu.config(width=18) self.mainHandMenu.grid(row=7, column=1, sticky='W', columnspan=3) self.mainHandDamage = Label(self.statPage, text='1d12+2', width=7) self.mainHandDamage.grid(row=7, column=4, columnspan=2) # Off hand weapon (for dual wield) self.offHandLabel = Label(self.statPage, text='Off hand:').grid(row=8, column=0, sticky='W') self.offHandVar = StringVar(self.statPage) self.offHandVar.set('Choose a weapon') self.offHandMenu = OptionMenu(self.statPage, self.offHandVar, *self.offHandTuple) self.offHandMenu.config(width=18) self.offHandMenu.grid(row=8, column=1, sticky='W', columnspan=3) # Ranged weapon self.rangedLabel = Label(self.statPage, text='Ranged: ').grid(row=9, column=0, sticky='W') self.rangedVar = StringVar(self.statPage) self.rangedVar.set('Choose a weapon') self.rangedMenu = OptionMenu(self.statPage, self.rangedVar, *self.rangedTuple) self.rangedMenu.config(width=18) self.rangedMenu.grid(row=9, column=1, sticky='W', columnspan=3) # Armor self.armorLabel = Label(self.statPage, text='Armor:').grid(row=10, column=0, sticky='W') self.armorVar = StringVar(self.statPage) self.armorVar.set('Choose armor') self.armorMenu = OptionMenu(self.statPage, self.armorVar, *self.armorTuple) self.armorMenu.config(width=18) self.armorMenu.grid(row=10, column=1, columnspan=3) for child in self.statPage.winfo_children(): child.grid_configure(padx=0, pady=2) def resultsPageDisplay(self): # Results frame of the window self.ResultsPage = Frame(self.root, padding=12) self.ResultsPage.grid(row=0, column=1, sticky=(N, S, E, W), rowspan=2) # HP Label and value Label(self.ResultsPage, text='Total HP:').grid(row=1, column=0, sticky='W') self.HPValue = Label(self.ResultsPage, text='0') self.HPValue.grid(row=1, column=1) # HP Dice label and value Label(self.ResultsPage, text='Hit Dice:').grid(row=2, column=0, sticky='W') self.HPDiceValue = Label(self.ResultsPage, text='1d6') self.HPDiceValue.grid(row=2, column=1) # Armor Class label and value Label(self.ResultsPage, text='Armor Class:').grid(row=3, column=0, sticky='W') self.ACValue = Label(self.ResultsPage, text=self.character.armorClass) self.ACValue.grid(row=3, column=1) # Initiative label and value Label(self.ResultsPage, text='Initiative:').grid(row=4, column=0, sticky='W') self.initiativeValue = Label(self.ResultsPage, text=self.strFormat(self.character.modifiers[1])) self.initiativeValue.grid(row=4, column=1) # Proficiency label, stringvar, and Proficiency value Label(self.ResultsPage, text='Proficiency Bonus:').grid(row=5, column=0) self.proficiencyValue = Label(self.ResultsPage, text='+2') self.proficiencyValue.grid(row=5, column=1) # Saving throws labels Label(self.ResultsPage, text="Saving Throws:").grid(row=6, column=0, sticky='W') [Label(self.ResultsPage, text=self.tuples.STAT_TUPLE[i]).grid(row=(i + 7), sticky=W) for i in range(len(self.tuples.STAT_TUPLE))] self.savingThrowValues = [Label(self.ResultsPage, text=self.strFormat(self.character.modifiers[i])) for i in range(len(self.tuples.STAT_TUPLE))] for i in range(len(self.savingThrowValues)): self.savingThrowValues[i].grid(row=i+7, column=1) # Perception label and value Label(self.ResultsPage, text='Perception:').grid(row=13, column=0, sticky='W') self.perceptionValue = Label(self.ResultsPage, text='-1') self.perceptionValue.grid(row=13, column=1) # Movement speed label and value Label(self.ResultsPage, text='Move Speed:').grid(row=14, column=0, sticky='W') self.speedValue = Label(self.ResultsPage, text='30ft.') self.speedValue.grid(row=14, column=1) for child in self.ResultsPage.winfo_children(): child.grid_configure(padx=0, pady=2) def skillsPageDisplay(self): # Skills frame self.SkillsPage = Frame(self.root, padding=12) self.SkillsPage.grid(row=0, column=2, rowspan=2) # Skills label and values Label(self.SkillsPage, text='Skills:').grid(row=1, column = 3, sticky='W') self.skillVar = [] self.skillBoxes = [] self.skillsValue = [Label(self.SkillsPage, text='-1') for i in range(len(self.tuples.SKILLS_TUPLE))] for i in range(len(self.tuples.SKILLS_TUPLE)): self.skillVar.append(IntVar()) self.skillBoxes.append(Checkbutton(self.SkillsPage, text=self.tuples.SKILLS_TUPLE[i], variable=self.skillVar[i])) self.skillBoxes[i].grid(row=i+2, column=3, sticky='W') for i in range(len(self.tuples.SKILLS_TUPLE)): self.skillBoxes[i].config(command=lambda i=i: self.skillCallback(i), state='disabled') for i in range(len(self.tuples.SKILLS_TUPLE)): self.skillsValue[i].grid(row=i+2, column=4) for child in self.SkillsPage.winfo_children(): child.grid_configure(padx=0, pady=2) def TotalDisplay(self): self.root = Tk() # self.s = Style() # self.s.theme_use() self.statFrameDisplay() self.resultsPageDisplay() self.skillsPageDisplay() self.root.mainloop()