How Do I Fill The Rest Of My Screen Design With Blank Frames In Tkinter Using For Loop?
Solution 1:
You can actually use 1-D list instead of 2-D list. Below is an example based on your code:
from tkinter import *
import random
root = Tk()
store_canvas = Frame(root)
store_canvas.pack()
# create the 25 frames
ROWS = COLS = 5
MAX_ITEMS = ROWS * COLS
frames = []
for i inrange(MAX_ITEMS):
frames.append(Frame(store_canvas, width=1520/COLS, height=1030/ROWS, bd=2, relief=SOLID))
frames[-1].grid(row=i//COLS, column=i%COLS)
frames[-1].pack_propagate(False)
# function to simulate retrieving data from database tabledefretrieve_tiem():
return [f"Item #{i+1}"for i inrange(random.randint(1,MAX_ITEMS))]
# function to show the retrieved itemsdefupdate_list():
Item_list = retrieve_tiem()
label_font = ("Arial", 20)
for i, frame inenumerate(frames):
for w in frame.winfo_children():
w.destroy()
if i < len(Item_list):
item = Item_list[i]
Button(frame).pack(fill="both", expand=1)
Label(frame, text=item, font=label_font, bg="darkgreen", fg="yellow").pack(fill="x")
update_list()
root.bind("<F5>", lambda e: update_list())
root.mainloop()
Solution 2:
The problem is with your try
statement. Here's an example:
a = 5try:
a += 7int("str") #This is just to raise an exceptionexcept:
pass
After running this code, the value of a
will be 12, even though an error occured. This is the same thing that is happening in your code. The line that creates the button is run successfully, but the creating the label raises an exception. This is why you get buttons in the remaining space. This can be resolved using else
.
If we try this instead:
a = 5try:
int("str") #This is just to raise an exceptionexcept:
passelse:
a += 7
The a += 7
line will only be run if there is not exception in the try
statement, so the value will remain 5. For your code, this will be
try:
Item_list[num] #This is what causes the errorexcept:
passelse:
Button(frame, anchor='nw', height = 9, width = 35, font = 20).pack()
Label(frame, text=str(Item_list[num]), anchor='nw', font = 20, width = 35, bg = 'darkgreen', fg = 'yellow' ).pack()
num += 1
Alternatively, you could have an if
statement to check if num
is larger than the length of the data returned, but there's not enough information in the question for me to be sure that will work.
Post a Comment for "How Do I Fill The Rest Of My Screen Design With Blank Frames In Tkinter Using For Loop?"