tkinter:滚动条在画布上不起作用

时间:2020-01-09 13:32:30

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

我正在尝试为可用于查看画布内容的滚动条进行编码。因此,在发生许多错误之后,我使滚动条停留在滚动位置,但即使向下滚动,滚动条仍继续在窗口的最上方显示内容,并且我看到了许多类似的问题和文章,涉及滚动条的工作方式在画布上,但对我没有用。

我还尝试使用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。这是我的第一个问题,对于任何错误,我们深表歉意。如果缺少任何信息,请告诉我,否则我应该使用完整的代码更新问题。 谢谢:)

1 个答案:

答案 0 :(得分:1)

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

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

通常,如果您尝试创建一组可滚动的窗口小部件,则将它们打包或网格化在框架中,然后使用create_window将框架添加到画布。关于如何实现堆栈溢出有几个示例。但是,由于原始代码使用的是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()