I’m trying to make a trading calculator for a Roblox game called Blox Fruits. The canvas windows have troubles loading in the widgets and instead show the red screen I presented to find any errors. They are canvas windows because I want the widgets to be scrollable.
The code for the main program:
<code>import tkinter
from tkinter import *
from tkinter import messagebox
from tkinter import ttk
import Blox_Fruit_Images
import Widget_Scroll
import time
def Calculate_Position(width, height):
return (thing.winfo_screenwidth() // 2) - (width // 2), (thing.winfo_screenheight() // 2) - (height // 2), width, height
def Open_All():
global ExtraWindow1
global ExtraWindow2
global ButtonScreen1
global ButtonScreen2
global List_Frame1
global List_Frame2
x, y, width, height = Calculate_Position(300, 400)
ExtraWindow1 = tkinter.Toplevel()
ExtraWindow1.title("Items")
ExtraWindow1.geometry("{}x{}+{}+{}".format(width, height, x - 500, y))
ExtraWindow1.minsize(width, height)
ttk.Label(ExtraWindow1, text = "Has", font = ("Courier New", 15)).pack()
ExtraWindow2 = tkinter.Toplevel()
ExtraWindow2.title("Items")
ExtraWindow2.geometry("{}x{}+{}+{}".format(width, height, x + 500, y))
ExtraWindow2.minsize(width, height)
ttk.Label(ExtraWindow2, text = "Wants", font = ("Courier New", 15)).pack()
x, y, width, height = Calculate_Position(300, 250)
ButtonScreen1 = tkinter.Toplevel()
ButtonScreen1.title("Blox Fruits")
ButtonScreen1.geometry("{}x{}+{}+{}".format(width, height, x - 180, y + 310))
ButtonScreen1.minsize(width, height)
ttk.Label(ButtonScreen1, text = "Fruit Select For Has:", font = ("Iskoola Pota", 15), background = "#DDD").pack(expand = True, fill = 'both')
List_Frame1 = Widget_Scroll.ListFrame(ButtonScreen1, FruitPNG, 100)
ButtonScreen2 = tkinter.Toplevel()
ButtonScreen2.title("Blox Fruits")
ButtonScreen2.geometry("{}x{}+{}+{}".format(width, height, x + 180, y + 310))
ButtonScreen2.minsize(width, height)
ttk.Label(ButtonScreen2, text = "Fruit Select For Wants:", font = ("Iskoola Pota", 15), background = "#DDD").pack(expand = True, fill = 'both')
List_Frame2 = Widget_Scroll.ListFrame(ButtonScreen2, FruitPNG, 100)
StartButton.pack_forget()
thing = Tk()
Blox_Fruit_Images.Get_Images()
FruitValues = [10674, 6869, 42683, 64306, 110390, 155785, 209169, 268343, 247635, 970053, 437599, 428933, 454409, 1315932, 722301, 777815, 1061254, 2302114, 1372802, 11778741, 2074213, 1614684, 7473688, 4104566, 9301721, 8031514, 1729666, 8255667, 2536794, 26811876,
34629694, 36907831, 9715332, 17081911, 16102844, 14782786, 158307821, 75133034, 116986257]
FruitNames = ["Rocket", "Spin", "Chop", "Spring", "Bomb", "Smoke", "Spike", "Flame", "Falcon", "Ice", "Sand", "Dark", "Diamond", "Light", "Rubber", "Barrier", "Ghost", "Magma", "Quake", "Buddha", "Love", "Spider", "Sound", "Phoenix", "Portal", "Rumble", "Pain",
"Blizzard", "Gravity", "Mammoth", "T-Rex", "Dough", "Shadow", "Venom", "Control", "Spirit", "Dragon", "Leopard", "Kitsune"]
FruitPrices = [5000, 7500, 30000, 60000, 80000, 100000, 180000, 250000, 300000, 350000, 420000, 500000, 600000, 650000, 750000, 800000, 940000, 960000, 1000000, 1200000, 1300000, 1500000, 1700000, 1800000, 1900000, 2100000, 2300000, 2400000, 2500000, 2700000, 2700000,
2800000, 2900000, 3000000, 3200000, 3400000, 3500000, 5000000, 8000000]
FruitImages = [Blox_Fruit_Images.Rocket, Blox_Fruit_Images.Spin, Blox_Fruit_Images.Chop, Blox_Fruit_Images.Spring, Blox_Fruit_Images.Bomb, Blox_Fruit_Images.Smoke, Blox_Fruit_Images.Spike, Blox_Fruit_Images.Flame, Blox_Fruit_Images.Falcon,
Blox_Fruit_Images.Ice, Blox_Fruit_Images.Sand, Blox_Fruit_Images.Dark, Blox_Fruit_Images.Diamond, Blox_Fruit_Images.Light, Blox_Fruit_Images.Rubber, Blox_Fruit_Images.Barrier, Blox_Fruit_Images.Ghost, Blox_Fruit_Images.Magma,
Blox_Fruit_Images.Quake, Blox_Fruit_Images.Buddha, Blox_Fruit_Images.Love, Blox_Fruit_Images.Spider, Blox_Fruit_Images.Sound, Blox_Fruit_Images.Phoenix, Blox_Fruit_Images.Portal, Blox_Fruit_Images.Rumble, Blox_Fruit_Images.Pain,
Blox_Fruit_Images.Blizzard, Blox_Fruit_Images.Gravity, Blox_Fruit_Images.Mammoth, Blox_Fruit_Images.Trex, Blox_Fruit_Images.Dough, Blox_Fruit_Images.Shadow, Blox_Fruit_Images.Venom, Blox_Fruit_Images.Control, Blox_Fruit_Images.Spirit,
Blox_Fruit_Images.Dragon, Blox_Fruit_Images.Leopard, Blox_Fruit_Images.Kitsune]
TradeData = list(zip(FruitNames, FruitValues))
FruitData = list(zip(FruitNames, FruitPrices))
FruitPNG = list(zip(FruitNames, FruitImages))
x, y, width, height = Calculate_Position(500, 300)
StartButton = Button(thing, text = "Start", width = 10, command = Open_All, bg = "#b5e2ff", activebackground = "#03c04a", activeforeground = "white", font = ("Helevetica", 10))
StartButton.pack()
Label(thing, text = "Blox Fruit Trade Calculator", font = ("Times New Roman", 20), bg = "#b5e2ff").pack()
thing.title("Main Window")
thing.geometry("{}x{}+{}+{}".format(width, height, x, y))
thing.minsize(width, height)
thing["bg"] = "#b5e2ff"
messagebox.showinfo("Welcome", "Welcome to the Blox Fruit Trade Calculator! This is an accurate trade calculator for the game Blox Fruits. This programs allows you to see if your trade is a underpay or overpay!")
thing.mainloop()
</code>
<code>import tkinter
from tkinter import *
from tkinter import messagebox
from tkinter import ttk
import Blox_Fruit_Images
import Widget_Scroll
import time
def Calculate_Position(width, height):
return (thing.winfo_screenwidth() // 2) - (width // 2), (thing.winfo_screenheight() // 2) - (height // 2), width, height
def Open_All():
global ExtraWindow1
global ExtraWindow2
global ButtonScreen1
global ButtonScreen2
global List_Frame1
global List_Frame2
x, y, width, height = Calculate_Position(300, 400)
ExtraWindow1 = tkinter.Toplevel()
ExtraWindow1.title("Items")
ExtraWindow1.geometry("{}x{}+{}+{}".format(width, height, x - 500, y))
ExtraWindow1.minsize(width, height)
ttk.Label(ExtraWindow1, text = "Has", font = ("Courier New", 15)).pack()
ExtraWindow2 = tkinter.Toplevel()
ExtraWindow2.title("Items")
ExtraWindow2.geometry("{}x{}+{}+{}".format(width, height, x + 500, y))
ExtraWindow2.minsize(width, height)
ttk.Label(ExtraWindow2, text = "Wants", font = ("Courier New", 15)).pack()
x, y, width, height = Calculate_Position(300, 250)
ButtonScreen1 = tkinter.Toplevel()
ButtonScreen1.title("Blox Fruits")
ButtonScreen1.geometry("{}x{}+{}+{}".format(width, height, x - 180, y + 310))
ButtonScreen1.minsize(width, height)
ttk.Label(ButtonScreen1, text = "Fruit Select For Has:", font = ("Iskoola Pota", 15), background = "#DDD").pack(expand = True, fill = 'both')
List_Frame1 = Widget_Scroll.ListFrame(ButtonScreen1, FruitPNG, 100)
ButtonScreen2 = tkinter.Toplevel()
ButtonScreen2.title("Blox Fruits")
ButtonScreen2.geometry("{}x{}+{}+{}".format(width, height, x + 180, y + 310))
ButtonScreen2.minsize(width, height)
ttk.Label(ButtonScreen2, text = "Fruit Select For Wants:", font = ("Iskoola Pota", 15), background = "#DDD").pack(expand = True, fill = 'both')
List_Frame2 = Widget_Scroll.ListFrame(ButtonScreen2, FruitPNG, 100)
StartButton.pack_forget()
thing = Tk()
Blox_Fruit_Images.Get_Images()
FruitValues = [10674, 6869, 42683, 64306, 110390, 155785, 209169, 268343, 247635, 970053, 437599, 428933, 454409, 1315932, 722301, 777815, 1061254, 2302114, 1372802, 11778741, 2074213, 1614684, 7473688, 4104566, 9301721, 8031514, 1729666, 8255667, 2536794, 26811876,
34629694, 36907831, 9715332, 17081911, 16102844, 14782786, 158307821, 75133034, 116986257]
FruitNames = ["Rocket", "Spin", "Chop", "Spring", "Bomb", "Smoke", "Spike", "Flame", "Falcon", "Ice", "Sand", "Dark", "Diamond", "Light", "Rubber", "Barrier", "Ghost", "Magma", "Quake", "Buddha", "Love", "Spider", "Sound", "Phoenix", "Portal", "Rumble", "Pain",
"Blizzard", "Gravity", "Mammoth", "T-Rex", "Dough", "Shadow", "Venom", "Control", "Spirit", "Dragon", "Leopard", "Kitsune"]
FruitPrices = [5000, 7500, 30000, 60000, 80000, 100000, 180000, 250000, 300000, 350000, 420000, 500000, 600000, 650000, 750000, 800000, 940000, 960000, 1000000, 1200000, 1300000, 1500000, 1700000, 1800000, 1900000, 2100000, 2300000, 2400000, 2500000, 2700000, 2700000,
2800000, 2900000, 3000000, 3200000, 3400000, 3500000, 5000000, 8000000]
FruitImages = [Blox_Fruit_Images.Rocket, Blox_Fruit_Images.Spin, Blox_Fruit_Images.Chop, Blox_Fruit_Images.Spring, Blox_Fruit_Images.Bomb, Blox_Fruit_Images.Smoke, Blox_Fruit_Images.Spike, Blox_Fruit_Images.Flame, Blox_Fruit_Images.Falcon,
Blox_Fruit_Images.Ice, Blox_Fruit_Images.Sand, Blox_Fruit_Images.Dark, Blox_Fruit_Images.Diamond, Blox_Fruit_Images.Light, Blox_Fruit_Images.Rubber, Blox_Fruit_Images.Barrier, Blox_Fruit_Images.Ghost, Blox_Fruit_Images.Magma,
Blox_Fruit_Images.Quake, Blox_Fruit_Images.Buddha, Blox_Fruit_Images.Love, Blox_Fruit_Images.Spider, Blox_Fruit_Images.Sound, Blox_Fruit_Images.Phoenix, Blox_Fruit_Images.Portal, Blox_Fruit_Images.Rumble, Blox_Fruit_Images.Pain,
Blox_Fruit_Images.Blizzard, Blox_Fruit_Images.Gravity, Blox_Fruit_Images.Mammoth, Blox_Fruit_Images.Trex, Blox_Fruit_Images.Dough, Blox_Fruit_Images.Shadow, Blox_Fruit_Images.Venom, Blox_Fruit_Images.Control, Blox_Fruit_Images.Spirit,
Blox_Fruit_Images.Dragon, Blox_Fruit_Images.Leopard, Blox_Fruit_Images.Kitsune]
TradeData = list(zip(FruitNames, FruitValues))
FruitData = list(zip(FruitNames, FruitPrices))
FruitPNG = list(zip(FruitNames, FruitImages))
x, y, width, height = Calculate_Position(500, 300)
StartButton = Button(thing, text = "Start", width = 10, command = Open_All, bg = "#b5e2ff", activebackground = "#03c04a", activeforeground = "white", font = ("Helevetica", 10))
StartButton.pack()
Label(thing, text = "Blox Fruit Trade Calculator", font = ("Times New Roman", 20), bg = "#b5e2ff").pack()
thing.title("Main Window")
thing.geometry("{}x{}+{}+{}".format(width, height, x, y))
thing.minsize(width, height)
thing["bg"] = "#b5e2ff"
messagebox.showinfo("Welcome", "Welcome to the Blox Fruit Trade Calculator! This is an accurate trade calculator for the game Blox Fruits. This programs allows you to see if your trade is a underpay or overpay!")
thing.mainloop()
</code>
import tkinter
from tkinter import *
from tkinter import messagebox
from tkinter import ttk
import Blox_Fruit_Images
import Widget_Scroll
import time
def Calculate_Position(width, height):
return (thing.winfo_screenwidth() // 2) - (width // 2), (thing.winfo_screenheight() // 2) - (height // 2), width, height
def Open_All():
global ExtraWindow1
global ExtraWindow2
global ButtonScreen1
global ButtonScreen2
global List_Frame1
global List_Frame2
x, y, width, height = Calculate_Position(300, 400)
ExtraWindow1 = tkinter.Toplevel()
ExtraWindow1.title("Items")
ExtraWindow1.geometry("{}x{}+{}+{}".format(width, height, x - 500, y))
ExtraWindow1.minsize(width, height)
ttk.Label(ExtraWindow1, text = "Has", font = ("Courier New", 15)).pack()
ExtraWindow2 = tkinter.Toplevel()
ExtraWindow2.title("Items")
ExtraWindow2.geometry("{}x{}+{}+{}".format(width, height, x + 500, y))
ExtraWindow2.minsize(width, height)
ttk.Label(ExtraWindow2, text = "Wants", font = ("Courier New", 15)).pack()
x, y, width, height = Calculate_Position(300, 250)
ButtonScreen1 = tkinter.Toplevel()
ButtonScreen1.title("Blox Fruits")
ButtonScreen1.geometry("{}x{}+{}+{}".format(width, height, x - 180, y + 310))
ButtonScreen1.minsize(width, height)
ttk.Label(ButtonScreen1, text = "Fruit Select For Has:", font = ("Iskoola Pota", 15), background = "#DDD").pack(expand = True, fill = 'both')
List_Frame1 = Widget_Scroll.ListFrame(ButtonScreen1, FruitPNG, 100)
ButtonScreen2 = tkinter.Toplevel()
ButtonScreen2.title("Blox Fruits")
ButtonScreen2.geometry("{}x{}+{}+{}".format(width, height, x + 180, y + 310))
ButtonScreen2.minsize(width, height)
ttk.Label(ButtonScreen2, text = "Fruit Select For Wants:", font = ("Iskoola Pota", 15), background = "#DDD").pack(expand = True, fill = 'both')
List_Frame2 = Widget_Scroll.ListFrame(ButtonScreen2, FruitPNG, 100)
StartButton.pack_forget()
thing = Tk()
Blox_Fruit_Images.Get_Images()
FruitValues = [10674, 6869, 42683, 64306, 110390, 155785, 209169, 268343, 247635, 970053, 437599, 428933, 454409, 1315932, 722301, 777815, 1061254, 2302114, 1372802, 11778741, 2074213, 1614684, 7473688, 4104566, 9301721, 8031514, 1729666, 8255667, 2536794, 26811876,
34629694, 36907831, 9715332, 17081911, 16102844, 14782786, 158307821, 75133034, 116986257]
FruitNames = ["Rocket", "Spin", "Chop", "Spring", "Bomb", "Smoke", "Spike", "Flame", "Falcon", "Ice", "Sand", "Dark", "Diamond", "Light", "Rubber", "Barrier", "Ghost", "Magma", "Quake", "Buddha", "Love", "Spider", "Sound", "Phoenix", "Portal", "Rumble", "Pain",
"Blizzard", "Gravity", "Mammoth", "T-Rex", "Dough", "Shadow", "Venom", "Control", "Spirit", "Dragon", "Leopard", "Kitsune"]
FruitPrices = [5000, 7500, 30000, 60000, 80000, 100000, 180000, 250000, 300000, 350000, 420000, 500000, 600000, 650000, 750000, 800000, 940000, 960000, 1000000, 1200000, 1300000, 1500000, 1700000, 1800000, 1900000, 2100000, 2300000, 2400000, 2500000, 2700000, 2700000,
2800000, 2900000, 3000000, 3200000, 3400000, 3500000, 5000000, 8000000]
FruitImages = [Blox_Fruit_Images.Rocket, Blox_Fruit_Images.Spin, Blox_Fruit_Images.Chop, Blox_Fruit_Images.Spring, Blox_Fruit_Images.Bomb, Blox_Fruit_Images.Smoke, Blox_Fruit_Images.Spike, Blox_Fruit_Images.Flame, Blox_Fruit_Images.Falcon,
Blox_Fruit_Images.Ice, Blox_Fruit_Images.Sand, Blox_Fruit_Images.Dark, Blox_Fruit_Images.Diamond, Blox_Fruit_Images.Light, Blox_Fruit_Images.Rubber, Blox_Fruit_Images.Barrier, Blox_Fruit_Images.Ghost, Blox_Fruit_Images.Magma,
Blox_Fruit_Images.Quake, Blox_Fruit_Images.Buddha, Blox_Fruit_Images.Love, Blox_Fruit_Images.Spider, Blox_Fruit_Images.Sound, Blox_Fruit_Images.Phoenix, Blox_Fruit_Images.Portal, Blox_Fruit_Images.Rumble, Blox_Fruit_Images.Pain,
Blox_Fruit_Images.Blizzard, Blox_Fruit_Images.Gravity, Blox_Fruit_Images.Mammoth, Blox_Fruit_Images.Trex, Blox_Fruit_Images.Dough, Blox_Fruit_Images.Shadow, Blox_Fruit_Images.Venom, Blox_Fruit_Images.Control, Blox_Fruit_Images.Spirit,
Blox_Fruit_Images.Dragon, Blox_Fruit_Images.Leopard, Blox_Fruit_Images.Kitsune]
TradeData = list(zip(FruitNames, FruitValues))
FruitData = list(zip(FruitNames, FruitPrices))
FruitPNG = list(zip(FruitNames, FruitImages))
x, y, width, height = Calculate_Position(500, 300)
StartButton = Button(thing, text = "Start", width = 10, command = Open_All, bg = "#b5e2ff", activebackground = "#03c04a", activeforeground = "white", font = ("Helevetica", 10))
StartButton.pack()
Label(thing, text = "Blox Fruit Trade Calculator", font = ("Times New Roman", 20), bg = "#b5e2ff").pack()
thing.title("Main Window")
thing.geometry("{}x{}+{}+{}".format(width, height, x, y))
thing.minsize(width, height)
thing["bg"] = "#b5e2ff"
messagebox.showinfo("Welcome", "Welcome to the Blox Fruit Trade Calculator! This is an accurate trade calculator for the game Blox Fruits. This programs allows you to see if your trade is a underpay or overpay!")
thing.mainloop()
The code for the custom made module “Scrollable Widgets” (Blox_Fruit_Images only imports images and therefore should have no bugs):
<code>import tkinter as tk
from tkinter import ttk
import Blox_Fruit_Images
test = tk.Tk()
Blox_Fruit_Images.Get_Images()
test.destroy()
class ListFrame(ttk.Frame):
def __init__(self, parent, text_data, item_height):
super().__init__(master = parent)
self.pack(expand = True, fill = 'both')
self.text_data = text_data
self.item_number = len(text_data)
self.list_height = self.item_number * item_height
self.canvas = tk.Canvas(self, background = 'red', scrollregion = (0,0,self.winfo_width(),self.list_height))
self.canvas.pack(expand = True, fill = 'both')
self.frame = ttk.Frame(self)
for index, item in enumerate(self.text_data):
self.create_item(index, item).pack(expand = True, fill = 'both', pady = 4, padx = 10)
self.scrollbar = ttk.Scrollbar(self, orient = 'vertical', command = self.canvas.yview)
self.canvas.configure(yscrollcommand = self.scrollbar.set)
self.scrollbar.place(relx = 1, rely = 0, relheight = 1, anchor = 'ne')
self.bind('<Configure>', self.update_size)
def update_size(self, event):
if self.list_height >= self.winfo_height():
height = self.list_height
self.scrollbar.place(relx = 1, rely = 0, relheight = 1, anchor = 'ne')
else:
height = self.winfo_height()
self.canvas.unbind_all('<MouseWheel>')
self.scrollbar.place_forget()
self.canvas.create_window((0,0), window = self.frame, anchor = 'nw', width = self.winfo_width(), height = height)
def create_item(self, index, item):
frame = ttk.Frame(self.frame)
frame.rowconfigure(0, weight = 1)
frame.columnconfigure((0,1,2,3,4), weight = 1, uniform = 'a')
ttk.Label(frame, text = f"{index + 1}: {item[0]}").grid(row = 0, column = 0)
ttk.Button(frame, image = f"{item[1]}").grid(row = 0, column = 2, columnspan = 3, sticky = 'nsew')
return frame
</code>
<code>import tkinter as tk
from tkinter import ttk
import Blox_Fruit_Images
test = tk.Tk()
Blox_Fruit_Images.Get_Images()
test.destroy()
class ListFrame(ttk.Frame):
def __init__(self, parent, text_data, item_height):
super().__init__(master = parent)
self.pack(expand = True, fill = 'both')
self.text_data = text_data
self.item_number = len(text_data)
self.list_height = self.item_number * item_height
self.canvas = tk.Canvas(self, background = 'red', scrollregion = (0,0,self.winfo_width(),self.list_height))
self.canvas.pack(expand = True, fill = 'both')
self.frame = ttk.Frame(self)
for index, item in enumerate(self.text_data):
self.create_item(index, item).pack(expand = True, fill = 'both', pady = 4, padx = 10)
self.scrollbar = ttk.Scrollbar(self, orient = 'vertical', command = self.canvas.yview)
self.canvas.configure(yscrollcommand = self.scrollbar.set)
self.scrollbar.place(relx = 1, rely = 0, relheight = 1, anchor = 'ne')
self.bind('<Configure>', self.update_size)
def update_size(self, event):
if self.list_height >= self.winfo_height():
height = self.list_height
self.scrollbar.place(relx = 1, rely = 0, relheight = 1, anchor = 'ne')
else:
height = self.winfo_height()
self.canvas.unbind_all('<MouseWheel>')
self.scrollbar.place_forget()
self.canvas.create_window((0,0), window = self.frame, anchor = 'nw', width = self.winfo_width(), height = height)
def create_item(self, index, item):
frame = ttk.Frame(self.frame)
frame.rowconfigure(0, weight = 1)
frame.columnconfigure((0,1,2,3,4), weight = 1, uniform = 'a')
ttk.Label(frame, text = f"{index + 1}: {item[0]}").grid(row = 0, column = 0)
ttk.Button(frame, image = f"{item[1]}").grid(row = 0, column = 2, columnspan = 3, sticky = 'nsew')
return frame
</code>
import tkinter as tk
from tkinter import ttk
import Blox_Fruit_Images
test = tk.Tk()
Blox_Fruit_Images.Get_Images()
test.destroy()
class ListFrame(ttk.Frame):
def __init__(self, parent, text_data, item_height):
super().__init__(master = parent)
self.pack(expand = True, fill = 'both')
self.text_data = text_data
self.item_number = len(text_data)
self.list_height = self.item_number * item_height
self.canvas = tk.Canvas(self, background = 'red', scrollregion = (0,0,self.winfo_width(),self.list_height))
self.canvas.pack(expand = True, fill = 'both')
self.frame = ttk.Frame(self)
for index, item in enumerate(self.text_data):
self.create_item(index, item).pack(expand = True, fill = 'both', pady = 4, padx = 10)
self.scrollbar = ttk.Scrollbar(self, orient = 'vertical', command = self.canvas.yview)
self.canvas.configure(yscrollcommand = self.scrollbar.set)
self.scrollbar.place(relx = 1, rely = 0, relheight = 1, anchor = 'ne')
self.bind('<Configure>', self.update_size)
def update_size(self, event):
if self.list_height >= self.winfo_height():
height = self.list_height
self.scrollbar.place(relx = 1, rely = 0, relheight = 1, anchor = 'ne')
else:
height = self.winfo_height()
self.canvas.unbind_all('<MouseWheel>')
self.scrollbar.place_forget()
self.canvas.create_window((0,0), window = self.frame, anchor = 'nw', width = self.winfo_width(), height = height)
def create_item(self, index, item):
frame = ttk.Frame(self.frame)
frame.rowconfigure(0, weight = 1)
frame.columnconfigure((0,1,2,3,4), weight = 1, uniform = 'a')
ttk.Label(frame, text = f"{index + 1}: {item[0]}").grid(row = 0, column = 0)
ttk.Button(frame, image = f"{item[1]}").grid(row = 0, column = 2, columnspan = 3, sticky = 'nsew')
return frame