我正在尝试为可用于查看画布内容的滚动条进行编码。因此,在发生许多错误之后,我使滚动条停留在滚动位置,但即使向下滚动,滚动条仍继续在窗口的最上方显示内容,并且我看到了许多类似的问题和文章,涉及滚动条的工作方式在画布上,但对我没有用。
我还尝试使用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()
这就是我对执行的看法。
如果我将滚动区域的坐标用作坐标,则可以如图所示向下滚动,但仍然看不到y = 750处的标签
我正在使用python 3.6.8。这是我的第一个问题,对于任何错误,我们深表歉意。如果缺少任何信息,请告诉我,否则我应该使用完整的代码更新问题。 谢谢:)
答案 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()