首页 > 解决方案 > 可滚动窗口 tkinter 不水平跨越整个屏幕

问题描述

问题:

我在 tkinter 中制作了一个可滚动的画布,但它没有水平填充整个画布。我尝试在网格化时添加 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()

标签: pythontkintergridscrollbar

解决方案


你试过这个方法columnconfigure(column, weight)吗?

weight决定了列将占据多宽,这是相对于其他列的。

columnconfigure(0, weight=1)并且 columnconfigure(1, weight=0)意味着column 0它将占据相对于 的所有空间column 1

代码:

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()

推荐阅读