Problem:
I made a scrollable canvas in tkinter but it isn't filling the whole canvas horizontally. I've tried adding weight = 1 and columnspan = 2 and other arguments when gridding but can't get it to fill properly. How can I make the widget span across the whole x axis?
Code:
from tkinter import *
from tkinter import ttk
import time
WIN_WIDTH = 800
WIN_HEIGHT = 600
PRIMARY_COLOUR = "#5AC1D0"
SECONDARY_COLOUR = "#7FDCA5"
FONT = "Courier"
class Display:
def __init__(self, tinstance):
__all__ = ["createDisplay", "updateDisplay", "destoryDisplay"]
self.tinstance = tinstance
def createDisplay(self, winresx, winresy, wintitle, useicon, iconpath):
self.tinstance.geometry("{}x{}+{}+{}".format(winresx, winresy, int(winresx / 2), int(winresy / 7)))
self.tinstance.title(wintitle)
#self.tinstance.resizable(0, 0)
self.tinstance.wm_attributes("-topmost", 1)
if useicon == True:
self.tinstance.call("wm", "iconphoto", self.tinstance._w, PhotoImage(file = iconpath))
def updateDisplay(self):
while True:
try:
self.tinstance.update_idletasks()
self.tinstance.update()
time.sleep(0.01)
except TclError:
pass
def destroyDisplay(self):
self.tinstance.destroy()
if __name__ == "__main__":
tk = Tk()
display = Display(tk)
display.createDisplay(WIN_WIDTH, WIN_HEIGHT, "Julie's Party Hire Store", True, "ico.png")
canvas = Canvas(tk, bg = PRIMARY_COLOUR, width = WIN_WIDTH, height = WIN_HEIGHT).grid(row = 0, column = 0)
title = Label(tk, text = "Welcome to Julie's Party Hire Store!", font = (FONT, 20), bg = SECONDARY_COLOUR)
title.grid(row = 0, column = 0, sticky = N)
#Scrollable window
scroll_wrapper = Frame(canvas)
scroll_canvas = Canvas(scroll_wrapper, bg = PRIMARY_COLOUR)
scroll_frame = Frame(scroll_canvas)
scroll_scrollbar = ttk.Scrollbar(scroll_wrapper, orient = "vertical", command = scroll_canvas.yview)
scroll_canvas.configure(yscrollcommand = scroll_scrollbar.set)
scroll_canvas.bind("<Configure>", lambda e: scroll_canvas.configure(scrollregion = scroll_canvas.bbox("all")))
scroll_canvas.create_window((0, 0), window = scroll_frame)
scroll_wrapper.grid(row = 0, column = 0, sticky = EW)
scroll_canvas.grid(row = 0, column = 0, sticky = EW)
scroll_scrollbar.grid(row = 0, column = 1, sticky = NS)
for i in range(1, 50):
b = Button(scroll_frame, text = "Button " + str(i)).grid(row = i, column = 0)
tk.mainloop()