def init_comparison_frames(self, parent): # Uses first two ranked players as default compares player1 = self.draft.draft_pool.players[0] player2 = self.draft.draft_pool.players[1] self.player1_frame = PlayerFrame(parent, player1) self.player1_frame.pack(side=LEFT, ipadx="10m") self.player1_button = Button(self.player1_frame, text="Update", font=("Sans", 6)) self.player1_button.pack(side=BOTTOM) self.player1_button.bind("<Button-1>", self.insert_comparison) self.player2_frame = PlayerFrame(parent, player2) self.player2_frame.pack(side=LEFT, ipadx="10m") self.player2_button = Button(self.player2_frame, text="Update", font=("Sans", 6)) self.player2_button.pack(side=BOTTOM) self.player2_button.bind("<Button-1>", self.insert_comparison)
class Application(Frame): def __init__(self, parent): Frame.__init__(self, parent) self.parent = parent self.parent.title("Draft Manager") self.pack() # FOR RESEARCH CAN BE COMMENTED OUT FOR REAL DRAFT self.proj_nr_results = [] self.proj_next_rounders = {} # Set root window size w = self.winfo_screenwidth() / 2 - 2 h = self.winfo_screenheight() self.parent.geometry('%dx%d+%d+%d' % (w, h, 0, 0)) self.parent.update() # Top container holds top 20 lists self.top_container = Frame(self) self.top_container.pack(side=TOP) # Mid container holds manipulation buttons self.mid_container = Frame(self) self.mid_container.pack(side=TOP) # Mid container 2 holds comparison frames (left) and # next rounders (right) self.mid_container2 = Frame(self) self.mid_container2.pack(side=TOP) self.mid2_left = Frame(self.mid_container2) self.mid2_left.pack(side=LEFT) self.mid2_right = Frame(self.mid_container2) self.mid2_right.pack(side=RIGHT) # canvas that holds the picks ticker, no need for frame # as it is a single object and spans entire width # ww = self.winfo_screenwidth() / 2 # self.pick_ticker = Canvas(self, width=ww, height=12) # self.pick_ticker.pack(side=TOP) # Bottom container holds team rosters self.bottom_container = Frame(self) self.bottom_container.pack(side=BOTTOM) self.bottom1 = Frame(self.bottom_container) self.bottom1.pack(side=TOP) self.bottom2 = Frame(self.bottom_container) self.bottom2.pack(side=TOP) # Initialize Draft object self.draft = Draft(TEAMS, IS_USER) # Initialize team frames self.init_teams() # Initialize manipulation buttons self.init_UI() # Initialize comparison frames self.init_comparison_frames(self.mid2_left) # Initialize next round listbox self.init_next_round_lb(self.mid2_right) # Initialize top 20 list boxes self.init_top20s() def init_teams(self): self.team_widgets = [] for i in range(NUM_TEAMS): if i < NUM_TEAMS / 2: self.team_widgets.append(TeamFrame(self.bottom1, TEAMS[i])) if i == 0: self.team_widgets[i].highlight_team() else: self.team_widgets.append(TeamFrame(self.bottom2, TEAMS[i])) for team_widget in self.team_widgets: team_widget.pack(side=LEFT, ipadx="10m", ipady=10) def init_top20s(self): """Creates top twenty label boxes for offensive positions. defenses and kickers are ommitted because of limited screen space and low value""" # Randomly generate players for development # players = generate_fake_players() players = self.draft.get_players() self.top20_widgets = [] self.top20_widgets.append(DPListbox(self.top_container, players, "Overall", True)) for pos in OFFENSIVE_POSITIONS: pos_players = filter_players_by_position(players, pos, 20) self.top20_widgets.append(DPListbox(self.top_container, pos_players, pos)) for widget in self.top20_widgets: widget.pack(side=LEFT) def init_UI(self): """Creates the entry field, draft button, and buttons that allow user to place increased importance on 'best rank'. """ self.search_entry = Entry(self.mid_container) self.search_entry.pack(side=LEFT) self.search_entry.bind("<Return>", self.draft_button_click) self.draft_button = Button(self.mid_container, text="Draft") self.draft_button.pack(side=LEFT, padx=10, pady=5) self.draft_button.bind("<Button-1>", self.draft_button_click) self.upside_plus_button = Button(self.mid_container, text="+ Upside Weight") self.upside_plus_button.pack(side=LEFT) self.upside_minus_button = Button(self.mid_container, text="- Upside Weight") self.upside_minus_button.pack(side=LEFT) def init_comparison_frames(self, parent): # Uses first two ranked players as default compares player1 = self.draft.draft_pool.players[0] player2 = self.draft.draft_pool.players[1] self.player1_frame = PlayerFrame(parent, player1) self.player1_frame.pack(side=LEFT, ipadx="10m") self.player1_button = Button(self.player1_frame, text="Update", font=("Sans", 6)) self.player1_button.pack(side=BOTTOM) self.player1_button.bind("<Button-1>", self.insert_comparison) self.player2_frame = PlayerFrame(parent, player2) self.player2_frame.pack(side=LEFT, ipadx="10m") self.player2_button = Button(self.player2_frame, text="Update", font=("Sans", 6)) self.player2_button.pack(side=BOTTOM) self.player2_button.bind("<Button-1>", self.insert_comparison) def init_next_round_lb(self, parent): self.next_round_lb = NextRoundLB(parent) self.next_round_lb.pack(side=LEFT) def draft_button_click(self, event): current_focus = self.focus_get() if isinstance(current_focus, Listbox): # Get index/name/player/position object and clear entry index = current_focus.curselection()[0] name = current_focus.get(index) current_focus.delete(index) draftee = self.draft.draft_by_name(name) position = draftee.get_position() # discover id of active top 20 widget counter = 0 for widget in self.top20_widgets: if current_focus.winfo_parent() == str(widget): current_focus = widget break else: counter += 1 if counter == 0: # case in which player has been selected from overall top 20 if position != "DST" and position != "K": counter = OFFENSIVE_POSITIONS.index(position) + 1 needs_replacement = name in self.top20_widgets[counter].get(0, END) self.top20_widgets[counter].delete_by_name(name) else: # if player has been selected from position sorted top 20 self.top20_widgets[0].delete_by_name(name) needs_replacement = True # If player was drafted through the entry field elif isinstance(current_focus, Entry): name = current_focus.get() current_focus.delete(0, END) draftee = self.draft.draft_by_name(name) if draftee == None: return position = draftee.get_position() self.top20_widgets[0].delete_by_name(name) if not position == "DST" and not position == "K": counter = OFFENSIVE_POSITIONS.index(position) + 1 needs_replacement = name in self.top20_widgets[counter].get(0, END) self.top20_widgets[counter].delete_by_name(name) # insert new name to fill position top 20 widget if not K or D/ST if not position == "DST" and not position == "K" and needs_replacement: new_list = filter_players_by_position(self.draft.get_players(), OFFENSIVE_POSITIONS[counter - 1], 20) if len(new_list) == 20: self.top20_widgets[counter].add_name(new_list[-1].get_name()) # send player to Team, retreive placement info, adjust TeamFrame current_pick = self.draft.get_current_pick() drafting_team = self.draft.order[current_pick] placement = self.draft.teams[drafting_team].place_draftee(draftee, current_pick) self.team_widgets[drafting_team].update_position(draftee.get_name(), placement) # increment counter, update highlights for TeamLabels self.draft.increment_current_pick() self.team_widgets[drafting_team].unhighlight_team() self.team_widgets[self.draft.order[ self.draft.current_pick]].highlight_team() self.update_next_rounders() # FOR RESEARCH if TRACK_PROJECTIONS: self.track_next_rounder_availability_alt() def update_next_rounders(self): team = self.draft.teams[self.draft.order[self.draft.get_current_pick()]] if team.is_user: self.next_round_lb.delete(0,END) for position in OFFENSIVE_POSITIONS: offset = self.draft.get_num_picks_before_next() next_player, cushion = self.draft.get_next(position, offset) string = "%s: %s (%s)" % (position, next_player, str(cushion)) self.next_round_lb.insert(END, string) def track_next_rounder_availability(self): """ This is being used to gather data, in order to make reasonable estimates about how probable players are to make it back to the user on his next turn. """ team = self.draft.teams[self.draft.order[self.draft.get_current_pick()]] if team not in self.proj_next_rounders.keys(): self.proj_next_rounders[team] = {} results = [] for nr in self.proj_next_rounders[team].keys(): current_round = self.proj_next_rounders[team][nr][0] offset = self.proj_next_rounders[team][nr][1] cushion = self.proj_next_rounders[team][nr][2] if nr in self.draft.draft_pool.players: results.append([current_round, offset, cushion, True]) print nr.get_name(), "is still available" else: results.append([current_round, offset, cushion, False]) print nr.get_name(), "is no longer available" if results: print "Results:", results self.proj_nr_results.append(results) self.proj_next_rounders[team] = {} for position in OFFENSIVE_POSITIONS: current_round = self.draft.current_round offset = self.draft.get_num_picks_before_next() next_player, cushion = self.draft.get_next_as_object(position, offset) self.proj_next_rounders[team][next_player] = [current_round, offset, cushion] def track_next_rounder_availability_alt(self): """ This is being used to gather data, in order to make reasonable estimates about how probable players are to make it back to the user on his next turn. This is a reformulation based on an idea about gathering more data faster. """ team = self.draft.teams[self.draft.order[self.draft.get_current_pick()]] if team not in self.proj_next_rounders.keys(): self.proj_next_rounders[team] = {} results = [] for nr in self.proj_next_rounders[team].keys(): current_round = self.proj_next_rounders[team][nr][0] cushion = self.proj_next_rounders[team][nr][1] offset = self.proj_next_rounders[team][nr][2] if nr in self.draft.draft_pool.players: results.append([current_round, cushion, offset, True]) print nr.get_name(), "is still available" else: results.append([current_round, cushion, offset, False]) print nr.get_name(), "is no longer available" if results: print "Results:", results for result in results: self.proj_nr_results.append(tuple(result)) self.proj_next_rounders[team] = {} for i in range(30): current_round = self.draft.current_round player = self.draft.draft_pool.players[i] offset = self.draft.get_num_picks_before_next() self.proj_next_rounders[team][player] = [current_round, i, offset] def insert_comparison(self, event): if event.widget == self.player1_button: player_frame = self.player1_frame else: player_frame = self.player2_frame current_focus = self.focus_get() index = current_focus.curselection()[0] name = current_focus.get(index) player = self.draft.get_player_by_name(name) player_frame.update_player(player)