PythonTkinter:向画布中的框架添加滚动条

PythonTkinter:向画布中的框架添加滚动条,python,canvas,tkinter,scrollbar,tkinter-canvas,Python,Canvas,Tkinter,Scrollbar,Tkinter Canvas,我对Tkinter很陌生,但是,尽管如此,我还是被要求“创建”一个简单的表单,用户可以在其中提供关于他们工作状态的信息(这是我通常工作的一个附带项目)。 由于我需要大量的文本小部件(用户需要提供关于文档状态或开放问题的评论,到目前为止),我希望有一些“可滚动”(沿y轴)的东西 我四处寻找解决方案,经过一些尝试和错误后,我发现了一些非常好的方法。 基本上我创建了一个画布,在画布中有一个滚动条和一个框架。在这个框架中,我有我需要的所有小部件 这是代码的一部分(只有一些实际的小部件,特别是文本小部件)

我对Tkinter很陌生,但是,尽管如此,我还是被要求“创建”一个简单的表单,用户可以在其中提供关于他们工作状态的信息(这是我通常工作的一个附带项目)。 由于我需要大量的文本小部件(用户需要提供关于文档状态或开放问题的评论,到目前为止),我希望有一些“可滚动”(沿y轴)的东西

我四处寻找解决方案,经过一些尝试和错误后,我发现了一些非常好的方法。 基本上我创建了一个画布,在画布中有一个滚动条和一个框架。在这个框架中,我有我需要的所有小部件

这是代码的一部分(只有一些实际的小部件,特别是文本小部件):

从Tkinter导入*
##我的形式框架
类simpleform_ap(Tk):
#建造师
定义初始化(自身,父级):
Tk.\uuuuuuuuuuuuuuuuuuuuu初始(自我,父)
self.parent=parent
self.initialize()
#
def初始化(自):
#
self.grid\u column配置(0,权重=1)
self.grid_rowconfigure(0,权重=1)
#
self.canvas=canvas(self.parent)
self.canvas.grid(行=0,列=0,sticky='nsew')
#
self.yscrollbar=滚动条(self,orient=垂直)
self.yscrollbar.grid(column=4,sticky=“ns”)
#
self.yscrollbar.config(命令=self.canvas.yview)
self.yscrollbar.pack(大小=RIGTH,展开=FALSE)
#
self.canvas.config(yscrollcommand=self.yscrollbar.set)
self.canvas.pack(side=LEFT,expand=TRUE,fill=BOTH)
#
self.frame1=Frame(self.canvas)
self.canvas.create_窗口(0,0,window=self.frame1,anchor='nw')
#各种小部件
#块零件
#标签
self.labelVariableIP=StringVar()#标签变量
labelIP=Label(self.frame1,textvariable=self.labelVariableIP,
anchor=“w”,
fg=“黑色”)
labelIP.grid(column=0,row=0,columnspan=1,sticky='EW')
self.labelVariableIP.set(u“IP:)
#条目:单行文本!!!!
self.entryVariableIP=StringVar()#输入字段的变量
self.entryIP=条目(self.frame1,
textvariable=self.entryVariableIP,bg=“白色”)
self.entryIP.grid(列=1,行=0,sticky='EW')
self.entryVariableIP.set(u“IP”)
#更新按钮或输入
button1=按钮(self.frame1,text=u“更新”,
command=self.OnButtonClickIP)
按钮1.网格(列=2,行=0)
self.entryIP.bind(“,self.OnPressEnterIP)
#...
#其他小部件在这里
#
#一些文本
#标签
self.labelVariableText=StringVar()#标签变量
labelText=标签(self.frame1,textvariable=
self.labelVariableText,
anchor=“nw”,
fg=“黑色”)
labelText.grid(列=0,行=curr\u行,列span=1,sticky='EW')
self.labelVariableTexta.set(u“插入一些文本:”)
#正文
textState=TRUE
self.TextVar=StringVar()
self.mytext=Text(self.frame1,state=textState,
高度=文字高度,宽度=10,
fg=“黑色”,bg=“白色”)
#
self.mytext.grid(column=1,row=curr\u row+4,columnspan=2,sticky='EW')
self.mytext.insert('1.0',“插入您的文本”)
#
#其他文本小部件在这里
#
self.update()
self.geometry(self.geometry())
self.frame1.update_idletasks()
self.canvas.config(scrollregion=(0,0,
self.frame1.winfo_width(),
self.frame1.winfo_height())
#
def释放_块(argv):
#创建表单
表单=简单表单(无)
表格标题(“发布信息”)
#
form.mainloop()
#
如果名称=“\uuuuu main\uuuuuuuu”:
释放块(系统argv)
正如我前面提到的,这个脚本非常有效,即使它有几个小问题,不是“基本的”,而是有点烦人

当我启动它时,我得到了以下信息(很抱歉屏幕截图不好):

可以看到,它只显示网格的第一个“列”,而我希望所有的列都显示出来(在我的例子中,它们应该是4) 要查看所有字段,我必须手动(用鼠标)调整窗口大小。 我想要的是这样的东西(所有4列都有):

此外,滚动条并没有扩展到整个窗体,但它只是在窗口的右下角

虽然后一个问题(滚动条)我可以留下,但第一个问题更为重要,因为我希望最终用户能够“了解”他们应该做什么,而无需调整窗口大小

有没有人知道我应该怎么做? 我错过了什么


提前感谢您在类的
\uuuu init\uuuu
方法中提供的帮助,您似乎没有设置主窗口的大小。您应该这样做,否则它只会将窗口设置为默认大小,这将只显示它所能显示的内容,在您的情况下,只显示1列。因此,在
\uuuu init\uuuu
方法中,尝试放置
self.geometry(str(您的\u宽度)+“x”+str(您的\u高度))
其中
您的\u宽度
您的\u高度
是您选择的任何整数,允许您在窗口中查看需要的内容

至于您的滚动条问题,我所要做的就是将您的滚动条添加到画布的方式更改为
.pack()
,并向其添加属性
fill='y'和side=RIGHT
,如下所示:

self.yscrollbar.pack(side = 'right', fill = 'y') 
self.scrollbar = Scrollbar(self,orient=VERTICAL,command=self.canvas.yview)
此外,您不需要:

self.yscrollbar.config(command=self.canvas.yview)
self.yscrollbar.pack(size=RIGHT,expand=FALSE)
只需将命令选项添加到滚动条的创建中,如下所示:

self.yscrollbar.pack(side = 'right', fill = 'y') 
self.scrollbar = Scrollbar(self,orient=VERTICAL,command=self.canvas.yview)
总之,以下更改应使代码按预期工作:

  • 加:

    def __init__(self,parent):
        Tk.__init__(self,parent)
        self.parent = parent
        self.initialize()
        # Resize the window from the default size to make your widgets fit. Experiment to see what is best for you.
        your_width = # An integer of your choosing
        your_height = # An integer of your choosing
        self.geometry(str(your_width) + "x" + str(your_height))
    
  • 添加和编辑:

    # Add `command=self.canvas.yview`
    self.yscrollbar = Scrollbar(self,orient=VERTICAL,command=self.canvas.yview)
    # Use `.pack` instead of `.grid`
    self.yscrollbar.pack(side = 'right', fill = 'y')
    
  • 删除:

    self.yscrollbar.config(command=self.canvas.yview)
    self.yscrollbar.pack(size=RIGHT,expand=FALSE)
    
在你身上