I started a simple OOP GUI project with tkinter in Python since I've been studying the basics for a while, but I'm not sure if my code is properly structured and following the programming conventions. I haven't finished it yet but the sooner I learn the good practices the better. My goal is to make a mini game. For now it only has a main window and a character selection window with some widgets in it. (For didactic purposes, I want it to be done with an OOP approach).
import tkinter as tk
from itertools import product
# Creating main page
class MainApplication(tk.Frame):
def __init__(self, master, *args, **kwargs):
tk.Frame.__init__(self, master, *args, **kwargs)
self.master = master
# produce the set of coordinates of the buttons
main_positions = product(range(2), range(5))
# Creating main page widgets
frame = tk.Frame(root, bg="#34495e")
frame.grid()
lb = tk.Label(frame, width=111, height=4, bg="#2c3e50", text="Champions", fg="white", font=50,
justify=tk.CENTER)
lb.grid(row=0, column=0, columnspan=5, pady=(0, 50), sticky="snew")
# Creating multiple buttons
for i, item in enumerate(main_positions):
button_main = tk.Button(frame, width=16, height=8, bg="#2c3e50", relief=tk.RIDGE, fg="white",
justify=tk.CENTER, text=f"Champion {item[1] + 1}",
command=ChampionWindow.champions_window)
button_main.grid(row=item[0] + 1, column=item[1], pady=(0, 50))
button = tk.Button(frame, width=30, height=3, bg="#2c3e50", relief=tk.RIDGE, text="Done", fg="white", font=20,
command=root.destroy)
button.grid(row=3, columnspan=5, pady=(0, 150))
# Creating champion select window
class ChampionWindow(tk.Frame):
def __init__(self, master, *args, **kwargs):
tk.Frame.__init__(self, master, *args, **kwargs)
self.master = master
@staticmethod
def champions_window():
ch_window = tk.Tk()
ch_window.title("Champion Select")
ch_window.resizable(False, False)
ch_window.configure(background="#192a56")
champion_position = product(range(30), range(5))
def scroll(ch_event):
ch_canvas.configure(scrollregion=ch_canvas.bbox("all"))
def select_champion():
pass
ch_canvas = tk.Canvas(ch_window, bg="blue", width=470, height=500)
ch_frame = tk.Frame(ch_canvas, bg="#273c75")
vscrollbar = tk.Scrollbar(ch_window, orient="vertical", command=ch_canvas.yview)
ch_canvas.configure(yscrollcommand=vscrollbar.set)
ch_canvas.grid(sticky="snew")
vscrollbar.grid(row=0, column=3, sticky="sn")
ch_canvas.create_window((0, 0), window=ch_frame, anchor="nw")
ch_frame.bind("<Configure>", scroll)
# Creating multiple buttons
for x, itm in enumerate(champion_position):
btn = tk.Button(ch_frame, width=12, height=6, bg="#2c3e50", relief=tk.RIDGE, fg="white", justify=tk.CENTER,
command=select_champion)
btn["text"] = f"Pick champ {x+1}"
btn.grid(row=itm[0], column=itm[1])
if __name__ == "__main__":
root = tk.Tk()
MainApplication(root)
root.configure(background="#273c75")
root.geometry("1000x570+450+200")
root.resizable(False, False)
root.title("Champion")
root.mainloop()
Images:
- The buttons open the character selection window
- In the future the buttons will pick the selected character that will be represented by an image with PIL library.