def __init__(self, teamNumber): self.number = teamNumber tbaInfo = tba.getTeamInfo(teamNumber) self.name = None self.attendedEvents = None if tba.isOnline( ): # will be false if no internet or can't connect to tba self.name = tbaInfo['teamName'] self.attendedEvents = tbaInfo['attendedEvents'] self.getTeamInfoFromJSON() self.image = GUI.filedir + "\\images\\default.jpg" for extension in imagetypes: imgpath = GUI.filedir + "\\images\\" + str(teamNumber) + extension if path.isfile(imgpath): self.image = imgpath break imgpath = GUI.filedir + "\\images\\" + str( teamNumber) + extension.upper() if path.isfile(imgpath): self.image = imgpath break if not inList(self, teams): teams.append(self)
def __init__(self, parent, *args): self.parent = parent # main notebook self.root = Notebook(parent) self.root.pack(expand=True, fill=BOTH) self.scoutingPage = scouting.ScoutingUI(self.root) self.pickListPage = pickList.PickList(self.root) self.sortPage = sort.Sort(self.root) self.root.select(0) # select the scouting page chooseFileBtn = Button(parent, text="Choose data folder", command=self.getFileDir) chooseFileBtn.pack(side=LEFT) # set our working directory chdir(path.dirname(__file__)) # set a reference to the current directory where we're looking for data self.fileStrVar = StringVar() global filedir filedir = getcwd() + "\\files" if len(filedir) > 20: filedir = "..." + filedir[-17:] self.fileStrVar.set(filedir) Label(parent, textvariable=self.fileStrVar).pack(side=LEFT) # selector for event self.eventSV = StringVar() self.eventSV.set(event) self.eventSV.trace('w', self.onEventChange) eventList = ["No internet connection"] if isOnline(): eventList = list(events.keys()) eventChooser = OptionMenu(parent, self.eventSV, *eventList) eventChooser.pack(side=RIGHT) Label(parent, text="Event:").pack(side=RIGHT)
def reloadTeams(self, eventcode): try: self.pickListBox.delete(0, END) except AttributeError: # we haven't created it yet pass self.teamsListBox.delete(0, END) if tba.isOnline(): teams = tba.getTeams(eventcode) else: teams = ["No internet connection"] self.teams = [] for team in teams: self.teamsListBox.insert(END, str(team)) self.teams.append(team) self.remainingTeams = self.teams
def addToPickList(self, *args): if not tba.isOnline(): return # TODO: store the picklist in an array of teams instead of strings/ints try: self.pickList.append( self.teamsListBox.get(self.teamsListBox.curselection())) except TclError: return length = self.pickListBox.size() self.pickListBox.insert( END, str(length + 1) + ". " + str(self.teamsListBox.get(self.teamsListBox.curselection()))) self.tags.append("") del (self.remainingTeams[self.remainingTeams.index( self.teamsListBox.get(self.teamsListBox.curselection()))]) self.teamsListBox.delete(self.teamsListBox.curselection())
def onEventChange(self, *args2): if not isOnline(): return event = events[self.eventSV.get()] self.pickListPage.reloadTeams(event)
from os import chdir, path, getcwd from tkinter import * from tkinter.filedialog import askdirectory from tkinter.ttk import * import pickList import scouting import sort from tba import getTeamEvents, isOnline # static vars filedir = "files" team = 4618 events = getTeamEvents(team) if not isOnline(): event = "No internet connection" else: event = next((iter(events.values()))) # default value class GUI: def __init__(self, parent, *args): self.parent = parent # main notebook self.root = Notebook(parent) self.root.pack(expand=True, fill=BOTH) self.scoutingPage = scouting.ScoutingUI(self.root) self.pickListPage = pickList.PickList(self.root)
def selectTeamFromList(self, teamNumber): if not tba.isOnline(): return # TODO: use team module instead # do we? idk? this whole thing has gone to crap and i cant wait to nuke it team = Team(teamNumber) self.currentTeam = team teamname = team.name attendedEvents = "Attended events:\n" for event, record in team.attendedEvents.items(): attendedEvents += "{}:{}".format(event, record) attendedEvents += '\n' for child in self.teamInfoFrame.winfo_children(): child.destroy() header = Label(self.teamInfoFrame, text="Team " + str(teamNumber) + " : " + teamname, font=("Helvetica", 20, "bold")) header.grid(row=0, column=0, columnspan=9999) attendedEvents = Label(self.teamInfoFrame, text=attendedEvents) attendedEvents.grid(row=1, column=0) # setup team image img = Image.open(team.image) def onImageClick(event): if system() == 'Darwin': # macOS subCall(('open', team.image)) elif system() == 'Windows': # Windows startfile(team.image) else: # linux variants subCall(('xdg-open', team.image)) # 231 x 231 is about the size of our defualt image, use that as our max size img.thumbnail((231, 231), Image.ANTIALIAS) self.photo = ImageTk.PhotoImage(img) imgLabel = Label(self.teamInfoFrame, image=self.photo) imgLabel.bind( "<Button-1>", onImageClick ) # call onImageClick when mouse1 is pressed on the image imgLabel.grid(row=1, column=1, padx=10, pady=10) # display scouting data scoutingDataFrame = Frame(self.teamInfoFrame) scoutingDataFrame.grid(row=2, column=0, columnspan=2, sticky=NSEW) # setup scroll bars and listbox to display the data scrollx = Scrollbar(scoutingDataFrame, orient=HORIZONTAL) scrolly = Scrollbar(scoutingDataFrame) self.scoutingDataLB = Listbox(scoutingDataFrame, xscrollcommand=scrollx.set, yscrollcommand=scrolly.set) self.scoutingDataLB.bind("<Double-Button-1>", self.graph) scrollx.config(command=self.scoutingDataLB.xview) scrolly.config(command=self.scoutingDataLB.yview) scrollx.grid(row=1, column=0, sticky=EW) scrolly.grid(row=0, column=1, sticky=NS) self.scoutingDataLB.grid(row=0, column=0, sticky=NSEW) scoutingDataFrame.columnconfigure(0, weight=1) # setup seperate box for comments because massimo wants it commentsScrollx = Scrollbar(scoutingDataFrame, orient=HORIZONTAL) commentsScrolly = Scrollbar(scoutingDataFrame) commentsLB = Listbox(scoutingDataFrame, xscrollcommand=commentsScrollx.set, yscrollcommand=commentsScrolly.set) commentsScrollx.config(command=commentsLB.xview) commentsScrolly.config(command=commentsLB.yview) commentsScrollx.grid(row=3, column=0) commentsScrolly.grid(row=2, column=1) commentsLB.grid(row=2, column=0, sticky=NSEW) commentsLB.insert(END, "Comments:") # load template with open("template.json", "r") as f: template = loadJSON(f) # loop though our scouting data, grab each question, and display it # categorize our data # vars for ints totals = {} increments = {} # non-ints nonInts = { } # going to be like this {question0:[data from match 1, match 2, match 3], question1:[... for key_, value_ in team.JSONdata.items(): for key, value in value_.items(): if key == "robot" or key == "match": continue if type(value) is int: try: totals[key] += value increments[key] += 1 except KeyError: totals[key] = value increments[key] = 1 else: if type(value) == bool: value = "Yes" if value else "No" try: nonInts[key].append(value) except KeyError: nonInts[key] = [value] for key, value in totals.items(): # find the question question = "" for i in template: try: if i['jsonLabel'] == key: question = i['question'] except KeyError: pass # add this question to our data output self.scoutingDataLB.insert( END, question + " : " + str(round((float(value) / increments[key]), 2))) for key, value in nonInts.items(): # find the question # this is pretty similar to the previous loop and could probably be combined but at this point idk if key != "comments": question = "" for i in template: try: if i['jsonLabel'] == key: question = i['question'] except KeyError: pass # add it to our box/output self.scoutingDataLB.insert(END, question + ":") for i in value: if i.strip() != '': if key == "comments": commentsLB.insert(END, " " + i) else: self.scoutingDataLB.insert(END, " " + i)
def selectTeamFromTeamList(self, *args): if not tba.isOnline(): return selected = self.teamsListBox.curselection() self.selectTeamFromList(self.teamsListBox.get(selected))