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

Python 如何为画布大小更新tkinter滚动条大小,python,tkinter,tkinter-canvas,Python,Tkinter,Tkinter Canvas,所以我想在窗口上有一个垂直和水平的滚动条,可以根据画布的大小自动更新。我在那里得到了一部分,现在代码为每次更新创建了额外的滚动条,而水平滚动条不跨越整个画布的长度。下面是我创建的一个示例来说明这一点: import tkinter from tkinter import ttk root = tkinter.Tk() root.state("zoomed") bigframe = tkinter.Frame(root) bigframe.pack(fill="

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

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, orient="vertical", command=canvas.yview)
    scrollbar.pack(side="right", fill="y")

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

root.mainloop()
导入tkinter
从tkinter导入ttk
root=tkinter.Tk()
root.state(“缩放”)
bigframe=tkinter.Frame(根)
pack(fill=“both”,expand=1)
canvas=tkinter.canvas(大框架)
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)
滚动条v.pack(side=“right”,fill=“y”)
滚动条包装(side=“bottom”,fill=“x”)
configure(yscrolllcommand=scrollbarv.set,xscrolllcommand=scrollbarh.set)
canvas.bind(“,lambda e:canvas.configure(scrollregion=canvas.bbox(“全部”))
mainframe=tkinter.Frame(画布)
canvas.create_window((0,0),window=mainframe,anchor=“nw”)
i=1
text=“你好,世界!”
def click():
全球i
全局文本
对于范围(10)内的t:
i+=1
text+=“你好,世界!”
标签(大型机,text=text).pack()
scrollbar=ttk.scrollbar(bigframe,orient=“vertical”,command=canvas.yview)
滚动条包装(side=“right”,fill=“y”)
button=tkinter.button(大型机,text=“单击我!”,command=Click)
button.pack()
root.mainloop()
这是我单击按钮4次时发生的情况:

我相信水平滚动条之所以小是因为我说的是
canvas.pack(side=“left”,fill=“both”,expand=1)
,但如果我说的是
side=“top
,那么垂直滚动条就不会跨越画布的高度。
是否存在导致多个滚动条问题或水平条问题的特定代码段?如果是,我应该如何修复它?

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

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, orient="vertical", 
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()
导入tkinter
从tkinter导入ttk
root=tkinter.Tk()
root.state(“缩放”)
bigframe=tkinter.Frame(根)
pack(fill=“both”,expand=1)
canvas=tkinter.canvas(大框架)
canvas.pack(side=“left”,fill=“both”,expand=1)
scrollbarv=ttk.Scrollbar(bigframe,orient=“vertical”,
command=canvas.yview)
scrollbarh=ttk.Scrollbar(root,orient=“horizontal”,
command=canvas.xview)
滚动条v.pack(side=“right”,fill=“y”)
滚动条包装(side=“bottom”,fill=“x”)
configure(yscrollcommand=scrollbarv.set,
xscrollcommand=scrollbarh.set)
canvas.bind(“”,lambda e:
configure(scrollregion=canvas.bbox(“全部”))
mainframe=tkinter.Frame(画布)
canvas.create_window((0,0),window=mainframe,anchor=“nw”)
i=1
text=“你好,世界!"
def updateScrollRegion():
canvas.update_idletasks()
canvas.config(scrollregion=mainframe.bbox())
def click():
全局i,滚动条,文本
对于范围(10)内的t:
i+=1
text+=“你好,世界!"
标签(大型机,text=text).pack()
button=tkinter.button(大型机,text=“单击我!”,command=Click)
button.pack()
root.mainloop()

当我尝试这种方法时,滚动条会变成灰色,并且不会滚动。不过,谢谢你的建议。你知道是否需要移动一些行才能使用这种方法吗?谢谢你的建议。利用你的想法,我可以通过使用一些全局变量来解决这个问题并消除多条问题那太好了,没问题。你能发布工作代码吗,我想看看。我使用了你的第一个建议,将destroy命令移到了ttk.Scrollbar命令的上方,并将global Scrollbar放在函数的顶部。如果你愿意,我可以尝试重新编写代码,但我只是作为一个示例来说明我的问题我研究的另一件事是,它是一个双滚动条框架,新颖而简单,它在简化过程的同时工作得很好