首页 > 解决方案 > Python - 如何将信息从字典添加到列表框小部件?

问题描述

这是我第一次遇到列表框,我想知道如何将每个团队成员的姓名插入到相应的列表框中。

我有一本名为 team 的字典,它存储的数据如下:

{'Team1': {'Aleks', Richard}, 'Team2': {'Louis'}, 'Team3': set(), 'Team4': set()}

我需要将一组名称放在特定的列表框中(例如'Team1'set 应该出现在 team1Members列表框中)。

我试图使用.insert方法从我的字典中插入特定项目,但我收到一个错误:

_tkinter.TclError: bad listbox index ".!frame.!listcheckpage": must be active, anchor, end, @x,y, or a number

我的代码:

from tkinter import *
from tkinter import messagebox
import tkinter.ttk as ttk
import time


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, TeamsPage, successfullAddTeam, selectionPage, listCheckPage):
            frame = F(container, self)
            self.frames[F] = frame
            frame.grid(row=0, column=0, sticky="nsew")
        self.show_frame(StartPage)
        self.lift()

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

        exit_Btn = Button(self, text="EXIT", font="Arial 16", width=8,
                          command=self.controller.destroy)
        exit_Btn.grid(row=2, column=0, columnspan=2, 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="Select one of two options",
                        font=('Arial', 25))
        heading.grid(row=0, column=0, columnspan=2, padx=250, 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=5, padx=5)

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

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

        AdditionalText = Label(self, text="Please select a team:", font="Arial 18")
        AdditionalText.grid(row=1, column=0, sticky=W, pady=15, padx=5)
        self.team_names = list(teams.keys())[:-1]
        self.teamSelection = OptionMenu(self, self.TeamName, *self.team_names)
        self.teamSelection.grid(row=1, column=1, sticky=W)

        backBtn = Button(self, text="BACK", font="Arial 16",
                         command=lambda: self.controller.show_frame(StartPage))
        backBtn.config(height=4, width=12)
        backBtn.grid(sticky=W, row=2, column=0, pady=5, padx=5)

        confirmBtn = Button(self, text="Confirm User", font="Arial 16",
                            command=self.confirm)
        confirmBtn.config(height=4, width=12)
        confirmBtn.grid(row=2, column=2, sticky=E, padx=45, pady=300)

    def confirm(self):
        if self.add_to_team():
            time.sleep(0.2)
            self.controller.show_frame(successfullAddTeam)

    def add_to_team(self):
        user = self.usernameEnter.get()
        if len(user) == 0:
            messagebox.showwarning(title='No user', message='Please enter a username!')
            return
        if self.usernameEnter.get():
            time.sleep(0.1)
            self.controller.show_frame(successfullAddTeam)

        team_name = self.TeamName.get()
        team = teams[team_name]

        if user in team:
            messagebox.showwarning(title='In team', message=f'{user} is already a member of {team_name}!')
        team.add(user)
        print(teams)


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

    def userEntry(self):
        successText = Label(self, text="You have successfully joined to a team!", font="Arial 25")

        successText.grid(row=0, column=0, columnspan=2, padx=180, pady=35)

        newUser = Button(self, text="Add another user", font="Arial 16",
                         command=lambda: self.controller.show_frame(selectionPage))
        newUser.config(height=3, width=12)
        newUser.grid(row=1, column=0, columnspan=2, padx=200, pady=10)

        checkList = Button(self, text="Check the lists", font="Arial 16",
                           command=lambda: self.controller.show_frame(listCheckPage))
        checkList.config(height=3, width=12)
        checkList.grid(row=2, column=0, columnspan=2, padx=200, pady=0)

#####################################Problem here###############################################

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

    def userEntry(self):
        team1Members = Listbox(self)
        team1Members.insert(self, teams['Team1'])
        team1Members.config(height=13, width=20)
        team1Members.grid(row=0, column=0, padx=10, pady=5, sticky=W)

        team2Members = Listbox(self)
        team2Members.insert(self, teams['Team2'])
        team2Members.config(height=13, width=20)
        team2Members.grid(row=0, column=1, padx=7, pady=5, sticky=W)

        team3Members = Listbox(self)
        team3Members.insert(self, teams['Team3'])
        team3Members.config(height=13, width=20)
        team3Members.grid(row=0, column=3, padx=7, pady=5, sticky=W)

        team4Members = Listbox(self)
        team4Members.insert(self, teams['Team4'])
        team4Members.config(height=13, width=20)
        team4Members.grid(row=0, column=4, padx=7, pady=5, sticky=W)

        addUserBtn = Button(self, text="Add User", font="Arial 16",
                            command=lambda: self.controller.show_frame(selectionPage))
        addUserBtn.config(height=3, width=18)
        addUserBtn.grid(row=1, column=4, sticky=S)


if __name__ == '__main__':
    teams = {}
    for team in range(1, 5):
        teams[f'Team{team}'] = set()
    app = CollegeApp()
    app.geometry("800x500")
    app.title('Points Counter')
    app.mainloop()

很明显我做错了什么,我想知道如何正确解决这个问题。

标签: pythonpython-3.xuser-interfacetkinter

解决方案


推荐阅读