【问题标题】:tkinter: scrollbar isn't working on canvastkinter:滚动条在画布上不起作用
【发布时间】:2020-04-27 03:01:24
【问题描述】:

我正在尝试编写可用于查看画布内容的滚动条。因此,在许多错误之后,我让滚动条停留在它滚动到的位置,但即使我向下滚动,它也会继续在窗口的最顶部显示内容,并且我看到了许多关于滚动条如何工作的类似问题和文章在画布上,但对我没有任何作用。

我也尝试使用 bbox("all") 来设置画布的滚动区域,但这也不起作用。使用框架也不起作用。在一些类似的问题上,我看到放置应该以特定的方式进行,但我不知道如何做到这一点,或者即使我的代码因此而无法工作。我制作了画布中给出的小部件。我看到在很多地方都使用 canvas.create_window 命令完成了相同的操作,但我不太明白如何使用它,没有它它也能正常工作,所以我没有打扰。

我在画布中使用了标签、条目、单选按钮、选项菜单和按钮。这是我使用 bbox("all") 的方法,它对我也不起作用,最终禁用了滚动条。我已经尽可能短了。

    from tkinter import *
    w = Tk()
    w.geometry('650x640')

    state=StringVar()

    c=Canvas(w,bg="gray94",height=750,width=650)
    c.config(scrollregion=c.bbox("all"))
    c.pack(expand=YES,fill=BOTH)

    scr=Scrollbar(c)
    scr.pack(side=RIGHT,fill=Y)

    c.config(yscrollcommand=scr.set)
    scr.config(command=c.yview)

    #widgets
    Button(c, text="Back").place(x=100,y=200)
    Label(c, text="Registration form",width=20,font=("bold",      
    20)).place(x=160,y=750)
    Label(c, text="State",width=20,font=("bold", 10)).place(x=149,y=390)
    l2 = ['KA','NY']
    dl2=OptionMenu(w,state, *l2)
    dl2.place(x=310,y=390)
    Button(c, text='Submit',width=20).place(x=240,y=690)

    w.mainloop()

这就是我执行时的样子。

tkinterwindow

如果我使用滚动区域的坐标,我可以如图所示向下滚动,但我仍然看不到 y=750 处的标签

withoutbbox

我正在使用 python 3.6.8。这是我的第一个问题,对于任何错误,我深表歉意,如果缺少任何信息,请告诉我,或者我应该用我的完整代码更新问题。 谢谢你:)

【问题讨论】:

  • 在您要创建滚动条小部件时设置滚动条方向和命令。写scr = Scrollbar(c,orient = "vertical",command = c.yview)
  • 您需要配置滚动区域,通常使用bbox("all")。如果您说它不起作用,请通过创建 minimal reproducible example 来展示您的尝试,该minimal reproducible example 还显示了您正在添加到画布的事物类型以及如何添加它们的示例。
  • @BryanOakley 使用 bbox("all") 实际上只是禁用了滚动条。我也更新了我的问题,希望这是您的要求。

标签: python-3.x tkinter scrollbar tkinter-canvas


【解决方案1】:

画布只会滚动画布对象。您使用place 添加按钮和标签,这意味着它们不是 画布对象。要将它们添加到画布以便它们滚动,您必须使用 c.create_window(...)

当使用c.bbox("all") 配置scrollregion 时,返回的边界框是None,因为它在画布上看不到任何项目。因此,滚动条被禁用。

通常,如果您尝试创建一组可滚动的小部件,您会将它们打包或网格化在一个框架中,然后使用create_window 将框架添加到画布。关于如何做到这一点,stackoverflow 上有几个示例。但是,由于您的原始代码使用place,因此您可以为每个小部件使用create_window,使用与place 相同的x/y 坐标。

这是您的代码,已修改为使用 create_window。我调整了主窗口的大小以显示滚动条可以正常工作。

from tkinter import *
w = Tk()
w.geometry('650x400')

state=StringVar()

c=Canvas(w,bg="gray94",height=750,width=650)
c.config(scrollregion=c.bbox("all"))
c.pack(expand=YES,fill=BOTH)

scr=Scrollbar(c)
scr.pack(side=RIGHT,fill=Y)

c.config(yscrollcommand=scr.set)
scr.config(command=c.yview)

l2 = ['KA', 'NY']

#widgets
button1 = Button(c, text="Back")
label1 = Label(c, text="Registration form", width=20, font=("bold", 20))
label2 = Label(c, text="State", width=20, font=("bold", 10))
dl2 = OptionMenu(w, state, *l2)
button2 = Button(c, text='Submit', width=20)

c.create_window(100, 200, window=button1)
c.create_window(160, 750, window=label1)
c.create_window(310, 390, window=dl2)
c.create_window(149, 390, window=label2)
c.create_window(240, 690, window=button2)

c.configure(scrollregio=c.bbox("all"))

w.mainloop()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-05
    • 1970-01-01
    • 2017-07-03
    • 2019-01-19
    • 2016-12-11
    • 1970-01-01
    相关资源
    最近更新 更多