【发布时间】:2021-04-12 17:31:03
【问题描述】:
我的计划是创建一个包含个人姓名的组合框,以便用户可以从集合中选择一个名称并将其点数输入到输入框中。我尝试这样做,但我的下拉列表没有显示个人集合中的名称列表,而是显示所有 5 个集合:Team1、Team2、Team3、Team4 和 Individuals。
最初,一切都安排好,以便用户输入个人的姓名,该姓名保存在字典teams = {... 'Individuals': set()} 中,之后姓名将显示在列表框中。在下一个窗口中,应该有一个下拉列表,其中包含个人集合中的所有名称,但是,正如我上面所说,我无法创建它。
我想知道如何解决这个问题。
我的代码:
from tkinter import *
from tkinter import messagebox
import tkinter.ttk as ttk
# This code is a simplified version of a full program code. In the original program, there is not only a list
# of individuals, but also lists of team1, team2 ... team4.
# However, now I am only interested in the problems associated with individual list,
# and I cut out all the part of the code related to team.
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 (IndividPage, listCheckPage, counterPage):
frame = F(container, self)
self.frames[F] = frame
frame.grid(row=0, column=0, sticky="nsew")
self.show_frame(IndividPage)
self.lift()
def show_frame(self, cont):
frame = self.frames[cont]
frame.tkraise()
# In this class I have created a window with entry widget to input name of individual and save it in
# eponymous set "Individual"
class IndividPage(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 User Name:", 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("Individual")
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=360)
# Checking the "add_to_team" function has been executed and moving to the next page.
def confirm(self):
if self.add_to_team():
self.controller.show_frame(listCheckPage)
# Function to check the presence of input
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():
self.controller.show_frame(listCheckPage)
team_name = self.TeamName.get()
team = teams[team_name]
team.add(user)
self.controller.frames[listCheckPage].team_listboxes[team_name].insert(END, user)
print(teams)
# Class that creates page with lists of four teams and individuals (Focusing on individuals right now)
# Also there is two buttons "Add User" and "Start Counter" to start points calculator
class listCheckPage(ttk.Frame):
def __init__(self, parent, controller):
self.controller = controller
ttk.Frame.__init__(self, parent)
self.userEntry()
def userEntry(self):
self.team_listboxes = {}
for col_num, teamname in enumerate(teams):
teamMembers = Listbox(self)
teamMembers.config(height=13, width=15)
teamMembers.grid(row=0, column=col_num, padx=5, pady=50, sticky=S)
for i, user in enumerate(teams[teamname]):
teamMembers.insert(i, user)
self.team_listboxes[teamname] = teamMembers
INDHeading = Label(self, text="Individuals", font="Arial 16")
INDHeading.grid(row=0, column=4, pady=0, padx=15, sticky=N)
addUserBtn = Button(self, text="Add User", font="Arial 16",
command=lambda: self.controller.show_frame(IndividPage))
addUserBtn.config(height=3, width=80)
addUserBtn.grid(row=1, column=0, columnspan=5, pady=0, sticky=N)
CounterBtn = Button(self, text="Start Counter", font="Arial 16",
command=lambda: self.controller.show_frame(counterPage))
CounterBtn.config(height=3, width=80)
CounterBtn.grid(row=2, column=0, columnspan=5, pady=0, sticky=N)
# Main problem start here
# This class creating dropdown menu (or combobox) with sets "teamX" and "Individual" but it was unplanned
# I want this combobox to show not all possible sets (team1, team2 etc.).
# Instead of that I want the combobox will show all the names that were entered in the "Individuals" set.
# I would also like to point out that the same process will be used for the sets of team1, team2 etc.
class counterPage(ttk.Frame):
def __init__(self, parent, controller):
self.controller = controller
ttk.Frame.__init__(self, parent)
self.userEntry()
def userEntry(self):
indivLabel = Label(self, text="Please select an individual: ", font="Arial 20")
indivLabel.grid(row=0, column=0, pady=10, padx=10)
IndivName = StringVar(self)
IndivName.set(teams['Individual'])
indivMenu = OptionMenu(self, IndivName, *teams)
indivMenu.grid(row=0, column=1, pady=10, padx=10)
backBtn = Button(self, text="BACK", font="Arial 16", height=2, width=6,
command=lambda: self.controller.show_frame(IndividPage))
backBtn.grid(row=7, column=0, sticky=W, pady=245, padx=10)
if __name__ == '__main__':
teams = {}
for team in range(1, 5):
teams[f'Team{team}'] = set()
teams = {'Team1': set(), 'Team2': set(), 'Team3': set(), 'Team4': set(), 'Individual': set()}
pointsInd = []
app = CollegeApp()
app.geometry("800x500")
app.resizable(False, False)
app.title('Points Counter')
app.mainloop()
【问题讨论】:
-
您能否缩短您的代码以仅包含显示问题的代码?查看here 了解如何创建一个最小的可重现示例。
-
顺便说一句,我建议至少在您弄清楚时删除
.geometry(),但问题是在第二页上,个人不适合该页面,这就是他们没有被看到的原因。
标签: python python-3.x user-interface tkinter