可滚动 window tkinter 不水平跨越整个屏幕
Scrollable window tkinter not spanning across whole screen horizontally
问题:
我在 tkinter 中制作了一个可滚动的 canvas,但它没有水平填充整个 canvas。我尝试在网格化时添加 weight = 1 和 columnspan = 2 以及其他参数,但无法正确填充。如何使小部件跨越整个 x 轴?
代码:
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()
你试过方法columnconfigure(column, weight)
了吗?
weight
决定了该列相对于其他列的宽度。
columnconfigure(0, weight=1)
和
columnconfigure(1, weight=0)
表示column 0
会占据相对于column 1
的所有space。
代码:
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_wrapper.columnconfigure(0, weight=1)
scroll_wrapper.columnconfigure(1, weight=0)
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)
#ttk.Label(scroll_wrapper, text='test').grid(column=2)
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()
问题:
我在 tkinter 中制作了一个可滚动的 canvas,但它没有水平填充整个 canvas。我尝试在网格化时添加 weight = 1 和 columnspan = 2 以及其他参数,但无法正确填充。如何使小部件跨越整个 x 轴?
代码:
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()
你试过方法columnconfigure(column, weight)
了吗?
weight
决定了该列相对于其他列的宽度。
columnconfigure(0, weight=1)
和
columnconfigure(1, weight=0)
表示column 0
会占据相对于column 1
的所有space。
代码:
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_wrapper.columnconfigure(0, weight=1)
scroll_wrapper.columnconfigure(1, weight=0)
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)
#ttk.Label(scroll_wrapper, text='test').grid(column=2)
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()