Reputation: 131
I have created a program, which allows user to enter usernames of individuals and assign specific number (points) to a particular name.
As a result, all data is stored in dictionary like that:
{'Username': 0, 'Username2': 0, .... and so on}
When User click on "Results" Button, new window appear and I can see this dictionary printed in terminal. However, now I want to print the data of this dictionary in Text box in new Tkinter window. I tried to do so, but nothing appears in text box.
Or I should use label widget to do so?
How to solve this problem?
I'm thinking that I should change something here, but I don't know what exactly
class resultPage(ttk.Frame):
def __init__(self, parent, controller):
self.controller = controller
ttk.Frame.__init__(self, parent)
self.userEntry()
def userEntry(self):
preInd = Label(self, text="Points of Individuals:", font="Arial 20")
preInd.grid(row=0, column=0, pady=10, padx=10)
self.inputInd = Text(self, height=10, width=15)
self.inputInd.grid(row=1, column=0)
for i in IndividPoints:
self.inputInd.insert(END, i + '\n')
if __name__ == '__main__':
Individuals = []
IndividPoints = {}
app = CollegeApp()
app.geometry("800x500")
app.resizable(False, False)
app.title('Points Counter')
app.mainloop()
Here is the working part of my code:
from tkinter import *
from tkinter import messagebox
import tkinter.ttk as ttk
class CollegeApp(Tk):
def __init__(self):
Tk.__init__(self)
self.container = ttk.Frame(self)
self.container.pack(side="top", fill="both", expand=True)
self.frames = {}
for F in (IndividPage, counterPage, resultPage):
frame = F(self.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()
def show_list_frame(self):
list_frame = counterPage(self.container, self)
list_frame.grid(row=0, column=0, sticky="nsew")
list_frame.tkraise()
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 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)
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)
def confirm(self):
if self.add_to_indivList():
pass
def add_to_indivList(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(counterPage)
if user in Individuals:
messagebox.showwarning(title='In team', message=f'{user} is already in Individuals list!')
Individuals.append(user)
processedInd = list(dict.fromkeys(Individuals))
self.controller.show_list_frame()
print(processedInd)
print(len(Individuals))
class counterPage(ttk.Frame):
def __init__(self, parent, controller):
self.controller = controller
ttk.Frame.__init__(self, parent)
self.userEntry()
def confirm2(self):
if self.get_points():
pass
def userEntry(self):
self.indList = Listbox(self)
self.indList.config(height=13, width=15)
self.indList.grid(row=0, column=0, padx=10, pady=20)
for user in Individuals:
self.indList.insert(END, user)
backBtn = Button(self, text="BACK", font="Arial 16", height=2, width=6,
command=lambda: self.controller.show_frame(IndividPage))
backBtn.grid(row=1, column=0, sticky=W, pady=10, padx=10)
testBtn = Button(self, text="Create Entry Boxes", command=self.indivSelect)
testBtn.grid(row=2, column=0, sticky=W)
resultBtn = Button(self, text="Results", height=2, width=6,
command=lambda: self.confirm2())
resultBtn.grid(row=3, column=0, sticky=W)
self.indList.bind("<<ListboxSelect>>", self.onSelect)
def onSelect(self, event):
selection = event.widget.curselection()
if selection:
print(f"User selected item {selection[0]}")
print("Click on 'Create Entry Boxes' button to enter points for selected user")
else:
print("User deselected")
def indivSelect(self):
self.ptEnter = []
for col_num in range(1, 6):
self.temp = Entry(self, width=2)
self.temp.grid(row=0, column=col_num)
self.ptEnter.append(self.temp)
def get_points(self):
def Ind_get_if_int(value):
if value.isnumeric():
return int(value)
return 0
pointsCalcuator = []
for self.temp in self.ptEnter:
pointsCalcuator.append(Ind_get_if_int(self.temp.get()))
selection = self.indList.curselection()
IndName = self.indList.get(selection[0])
IndividPoints[IndName] = sum(pointsCalcuator)
print(IndividPoints)
self.controller.show_frame(resultPage)
class resultPage(ttk.Frame):
def __init__(self, parent, controller):
self.controller = controller
ttk.Frame.__init__(self, parent)
self.userEntry()
def userEntry(self):
preInd = Label(self, text="Points of Individuals:", font="Arial 20")
preInd.grid(row=0, column=0, pady=10, padx=10)
self.inputInd = Text(self, height=10, width=15)
self.inputInd.grid(row=1, column=0)
for i in IndividPoints:
self.inputInd.insert(END, i + '\n')
if __name__ == '__main__':
Individuals = []
IndividPoints = {}
app = CollegeApp()
app.geometry("800x500")
app.resizable(False, False)
app.title('Points Counter')
app.mainloop()
Upvotes: 0
Views: 643
Reputation: 6156
Does this fix Your issue (changes to the code You said wasn't working):
import tkinter.ttk as ttk
from tkinter import Tk, END, Label, Text
class resultPage(ttk.Frame):
def __init__(self, parent, controller):
self.controller = controller
ttk.Frame.__init__(self, parent)
self.userEntry()
def userEntry(self):
preInd = Label(self, text="Points of Individuals:", font="Arial 20")
preInd.grid(row=0, column=0, pady=10, padx=10)
self.inputInd = Text(self, height=10, width=15)
self.inputInd.grid(row=1, column=0)
for i in IndividPoints:
self.inputInd.insert(END, i + '\n')
if __name__ == '__main__':
Individuals = []
IndividPoints = {'Username': 0, 'Username2': 0}
app = Tk()
app.geometry("800x500")
app.resizable(False, False)
app.title('Points Counter')
resultPage(app, None).pack()
app.mainloop()
First of I added values to IndividPoints and second I actually packed the frame so that is on screen (You will have to adjust that accordingly but this example works)
Upvotes: 1