微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Python - 如何将 OpenMenu 选项分配为列表?

如何解决Python - 如何将 OpenMenu 选项分配为列表?

我创建了 Frame with Entry 小部件以要求用户输入他的用户名并选择一个他想要加入的团队,我还创建了一个 OpenMenu 小部件,其中包含 4 个用户可以加入的团队。

我想知道,如何将列表作为列表分配给 OpenMenu 变体。例如:选择“Team 1” = team1Members

我还想知道,如何将 Entry Widget 中的数据分配到适当的列表。例如,如果用户选择了“Team 1”,他的用户名将附加到 team1Members 列表中。

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,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,padx=30,pady=5)

        exit_Btn = Button(self,text="EXIT",command=self.controller.destroy)
        exit_Btn.grid(row=1,column=1,pady=5)

    def starting_Program(self):
        pass


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

    def teamSelect(self):
        heading = Label(self,text="Become a member of a Team",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,padx=270,pady=5)

class TeamsPage(ttk.Frame):

    def __init__(self,parent)
        self.userEntry()

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

        usernameEnter = Entry(self,width=40)
        usernameEnter.grid(row=0,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,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,sticky=W)

        confirmBtn = Button(self,text="Submit",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()

此窗口的屏幕截图:

enter image description here

解决方法

有几种方法可以实现这一点。第一种方法是创建一个团队列表并在 optionMenu 中使用 * 将它们解包,然后使用 if else 条件检查要附加到哪个列表。

这是一个演示

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,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())
         ...

但更好的方法是创建一个字典。如图所示

def __init__(self,parent)
        self.teamList = {"Team1": team1Members,"Team2": team2Members,"Team3":team3Members,"Team 4": team4Members}

        self.userEntry()

    def userEntry(self):

        ...
        self.usernameEnter = Entry(self,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.teamList.keys())
        teamSelection.grid(row=1,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())

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。