如何更新画布大小的 tkinter 滚动条大小

问题描述

所以我想在窗口上有一个垂直和水平滚动条,它会根据画布的大小自动更新。我在那里得到了一部分,现在代码为每次更新创建额外的滚动条,并且水平滚动条不会跨越整个画布的长度。这是我创建的一个示例来说明这一点:

import tkinter
from tkinter import ttk



root = tkinter.Tk()
root.state("zoomed")
bigframe = tkinter.Frame(root)
bigframe.pack(fill="both",expand=1)
canvas = tkinter.Canvas(bigframe)
canvas.pack(side="left",fill="both",expand=1)
scrollbarv = ttk.Scrollbar(bigframe,orient="vertical",command=canvas.yview)
scrollbarh = ttk.Scrollbar(bigframe,orient="horizontal",command=canvas.xview)
scrollbarv.pack(side="right",fill="y")
scrollbarh.pack(side="bottom",fill="x")
canvas.configure(yscrollcommand=scrollbarv.set,xscrollcommand=scrollbarh.set)
canvas.bind("<Configure>",lambda e: canvas.configure(scrollregion=canvas.bBox("all")))
mainframe = tkinter.Frame(canvas)
canvas.create_window((0,0),window=mainframe,anchor="nw")


i = 1
text = "Hello World! "
def click():
    global i
    global text
    for t in range(10):
        i += 1
        text += "Hello World! "
        tkinter.Label(mainframe,text=text).pack()
    scrollbar = ttk.Scrollbar(bigframe,command=canvas.yview)
    scrollbar.pack(side="right",fill="y")

button = tkinter.Button(mainframe,text="Click me!",command=click)
button.pack()

root.mainloop()

这是我点击按钮 4 次时发生的情况:

我相信水平滚动条很小是因为我说 canvas.pack(side="left",expand=1),但如果我说 side="top,那么垂直滚动条不会跨越画布的高度。 是否有一些特定的代码导致了多个滚动条问题或水平条问题?如果是这样,我应该如何解决它?

解决方法

在添加新滚动条之前,您必须先销毁旧滚动条。只需将 scrollbar.destroy() 添加到您的点击函数中,就像我在下面所做的那样:

def click():
    global i
    global text
    for t in range(10):
        i += 1
        text += "Hello World! "
        tkinter.Label(mainframe,text=text).pack()
    scrollbar = ttk.Scrollbar(bigframe,orient="vertical",command=canvas.yview)
    scrollbar.destroy()
    scrollbar.pack(side="right",fill="y")

我对您的代码进行了以下更改。起初它不起作用,但是如果我调整窗口大小,它就可以正常工作。

import tkinter
from tkinter import ttk



root = tkinter.Tk()
root.state("zoomed")
bigframe = tkinter.Frame(root)
bigframe.pack(fill="both",expand=1)
canvas = tkinter.Canvas(bigframe)
canvas.pack(side="left",fill="both",expand=1)
scrollbarv = ttk.Scrollbar(bigframe,command=canvas.yview)
scrollbarh = ttk.Scrollbar(root,orient="horizontal",command=canvas.xview)
scrollbarv.pack(side="right",fill="y")
scrollbarh.pack(side="bottom",fill="x")
canvas.configure(yscrollcommand=scrollbarv.set,xscrollcommand=scrollbarh.set)
canvas.bind("<Configure>",lambda e: 
canvas.configure(scrollregion=canvas.bbox("all")))
mainframe = tkinter.Frame(canvas)
canvas.create_window((0,0),window=mainframe,anchor="nw")


i = 1
text = "Hello World! "

def updateScrollRegion():
    canvas.update_idletasks()
    canvas.config(scrollregion=mainframe.bbox())

def click():
    global i,scrollbarv,text
    for t in range(10):
        i += 1
        text += "Hello World! "
        tkinter.Label(mainframe,text=text).pack()

button = tkinter.Button(mainframe,text="Click me!",command=click)
button.pack()

root.mainloop()