Search code examples
pythonpython-3.xtkintertkinter-entry

Python - How to assign OpenMenu choice as a List?


I have created Frame with Entry widget to ask user to input his Username and select a team, that he want to join in and also I have created an OpenMenu Widget with 4 teams that user can join.

I want to know, how to assign list to OpenMenu variations as a list. For example: Selection "Team 1" = team1Members etc.

Also I want to know, how to assign data from Entry Widget to appropriate list. For example, if user have selected "Team 1", his username will append to team1Members list.

from tkinter import *
import tkinter.ttk as ttk

team1Members = []
team2Members = []
team3Members = []
team4Members = []


class CollegeApp(Tk):
    def __init__(self):
        Tk.__init__(self)
        container = ttk.Frame(self)
        container.pack(side="top", fill="both", expand=True)
        self.frames = {}
        for F in (StartPage, selectionPage, TeamsPage):
            frame = F(container, self)
            self.frames[F] = frame
            frame.grid(row=0, column=0, sticky="nsew")
        self.show_frame(StartPage)

    def show_frame(self, cont):
        frame = self.frames[cont]
        frame.tkraise()


class StartPage(ttk.Frame):
    def __init__(self, parent, controller):
        self.controller = controller
        ttk.Frame.__init__(self, parent)
        self.startMenu()

    def startMenu(self):
        heading = Label(self, text="College Tournament Points\n Count Software",
                        font=('Arial', 25))
        heading.grid(row=0, column=0, columnspan=2, padx=240, pady=40)

        start_Btn = Button(self, text="Start", font="Arial 16", width=8,
                           command=lambda: self.controller.show_frame(selectionPage))
        start_Btn.grid(row=1, column=0, padx=30, pady=5)

        exit_Btn = Button(self, text="EXIT", font="Arial 16", width=8,
                          command=self.controller.destroy)
        exit_Btn.grid(row=1, column=1, padx=30, pady=5)

    def starting_Program(self):
        pass


class selectionPage(ttk.Frame):
    def __init__(self, parent, controller):
        self.controller = controller
        ttk.Frame.__init__(self, parent)
        self.teamSelect()

    def teamSelect(self):
        heading = Label(self, text="Become a member of a Team",
                        font=('Arial', 25))
        heading.grid(row=0, column=0, columnspan=2, padx=200, pady=40)

        teams = Button(self, text="Teams", font="Arial 24", width=15,
                       command=lambda: self.controller.show_frame(TeamsPage))
        teams.grid(row=1, column=0, padx=270, pady=5)

class TeamsPage(ttk.Frame):

    def __init__(self, parent, controller):
        self.controller = controller
        ttk.Frame.__init__(self, parent)
        self.userEntry()

    def userEntry(self):
        headingTest = Label(self, text="Enter your Username:", font="Arial 20")
        headingTest.grid(row=0, column=0, pady=0)

        usernameEnter = Entry(self, width=40)
        usernameEnter.grid(row=0, column=1, padx=2, pady=10)

        UserName = StringVar(self)
        UserName.set("Team1")

        AdditionalText = Label(self, text="Please select a team:", font="Arial 18") 
        AdditionalText.grid(row=1, column=0, sticky=W, pady=15)

        teamSelection = OptionMenu(self, UserName, "Team1", "Team2", "Team3", "Team 4") # How to link those variations to team list? For example: Team 1 = team1Members?
        teamSelection.grid(row=1, column=1, sticky=W)

        confirmBtn = Button(self, text="Submit", font="Arial 16",
                            command=()) # Command to Save username in teamXMembers list. Depends on the user selection 
        confirmBtn.config(height=4, width=12)
        confirmBtn.grid(row=2, column=2, sticky=E, padx=65, pady=300)

        


if __name__ == '__main__':
    app = CollegeApp()
    app.geometry("800x500")
    app.title('Points Counter')
    app.mainloop()

Screenshot of this window: enter image description here


Solution

  • There are few ways that could achieve this. The First would be to create a list of teams and unpack them using * in optionMenu then use if else condition to check which list to append to.

    Here is a demo

    class TeamsPage(ttk.Frame):
    
        def __init__(self, parent, controller):
            self.controller = controller
            ttk.Frame.__init__(self, parent)
            self.teamList = ["Team1", "Team2", "Team3", "Team 4"]
    
            self.userEntry()
    
        def userEntry(self):
            ...
            self.usernameEnter = Entry(self, width=40)
            self.usernameEnter.grid(row=0, column=1, padx=2, pady=10)
    
            self.userName = StringVar(self)
            self.userName.set("Team1")
    
            teamSelection = OptionMenu(self, self.userName, *self.teamList) 
            teamSelection.grid(row=1, column=1, sticky=W)
    
            confirmBtn = Button(self, text="Submit", font="Arial 16",
                                command= self.updateTeamList) # Command to Save username in teamXMembers list. Depends on the user selection 
            ...
    
            
        def updateTeamList(self):
          
            if self.userName.get() == self.teamList[0]:
                team1Members.append(self.usernameEnter.get())
    
            elif self.userName.get() == self.teamList[1]:
                team2Members.append(self.usernameEnter.get())
             ...
    

    but a better way would be to create a dictionary. something as shown

    def __init__(self, parent, controller):
            self.controller = controller
            ttk.Frame.__init__(self, parent)
            self.teamList = {"Team1": team1Members , "Team2": team2Members,
                             "Team3":team3Members, "Team 4": team4Members}
    
            self.userEntry()
    
        def userEntry(self):
    
            ...
            self.usernameEnter = Entry(self, width=40)
            self.usernameEnter.grid(row=0, column=1, padx=2, pady=10)
    
            self.userName = StringVar(self)
            self.userName.set("Team1")
    
            AdditionalText = Label(self, text="Please select a team:", font="Arial 18") 
            AdditionalText.grid(row=1, column=0, sticky=W, pady=15)
    
            teamSelection = OptionMenu(self, self.userName, *self.teamList.keys())
            teamSelection.grid(row=1, column=1, sticky=W)
    
            confirmBtn = Button(self, text="Submit", font="Arial 16",
                                command= self.updateTeamList) # Command to Save username in teamXMembers list. Depends on the user selection 
            ...
        
        def updateTeamList(self):
           
            self.teamList[self.userName.get()].append(self.usernameEnter.get())