【问题标题】:How to update tkinter scrollbar size for canvas size如何更新画布大小的 tkinter 滚动条大小
【发布时间】:2021-01-10 18:19:14
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: python tkinter tkinter-canvas


    【解决方案1】:

    在添加新滚动条之前,您必须销毁旧滚动条。只需将 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, 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()
    

    【讨论】:

    • 当我尝试这样做时,滚动条变成灰色并且不滚动。 (还是)感谢你的建议。您是否知道是否需要移动某些行才能使用此方法?
    • 感谢您的建议。使用您的想法,我能够通过弄乱一些全局变量来修复它并消除多条问题
    • 哦,太好了,没问题。能否请您发布工作代码,我想看看。
    • 我使用了你的第一个建议,将destroy命令移到了ttk.Scrollbar命令的上方,并将全局滚动条放在了函数的顶部。如果您愿意,我可以尝试重新编写代码,但我只是将其作为示例来说明我的问题,它在我的主程序代码中完全不同。
    • 我研究的另一件事是gist.github.com/novel-yet-trivial/…,这是一个新颖而琐碎的双滚动条框架,它在简化流程的同时工作得很好
    猜你喜欢
    • 2014-06-04
    • 2014-03-29
    • 2021-06-30
    • 1970-01-01
    • 2017-08-07
    • 2019-10-01
    • 2012-05-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多