Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用Tkinter进行滚动和正确缩放_Python_Tkinter_Tk_Tkinter Canvas - Fatal编程技术网

Python 使用Tkinter进行滚动和正确缩放

Python 使用Tkinter进行滚动和正确缩放,python,tkinter,tk,tkinter-canvas,Python,Tkinter,Tk,Tkinter Canvas,我需要这个简单的表格来: 1) 调整窗口大小时正确展开字段,并 2) 正确滚动字段列表 我已经尝试了所有我能想到的方法,上面两个条件中只有一个是真的。此代码正确展开,但不会滚动。如果没有frame2,并且将字段添加到frame或canvas,则情况正好相反 class test(Tkinter.Tk): def __init__(self,parent): Tkinter.Tk.__init__(self,parent) self.parent = pa

我需要这个简单的表格来: 1) 调整窗口大小时正确展开字段,并 2) 正确滚动字段列表

我已经尝试了所有我能想到的方法,上面两个条件中只有一个是真的。此代码正确展开,但不会滚动。如果没有frame2,并且将字段添加到frame或canvas,则情况正好相反

class test(Tkinter.Tk):

    def __init__(self,parent):
        Tkinter.Tk.__init__(self,parent)
        self.parent = parent
        self.initialize()

    def makeform(self, root, fields):
        i = 0
        for field in fields:
            Label(root, text=field + ": ", anchor=W).grid(row=i)
            entry = Entry(root)
            entry.grid(row=i, column=1, sticky=E+W)
            entries[field] = entry
            i += 1

    def initialize(self):

        frame = Frame(self)
        frame.rowconfigure(0, weight=1)
        frame.columnconfigure(0, weight=1)
        frame.grid(sticky=N+S+E+W)

        canvas = Canvas(frame, width=900, height=800, bg='pink')
        canvas.grid(row=0, column=0, sticky=N+S+E+W)
        canvas.columnconfigure(0,weight=1)
        canvas.rowconfigure(0,weight=1)

        frame2 = Frame(canvas)
        frame2.grid(row=0, column=0, sticky=N+S+E+W)
        frame2.columnconfigure(1, weight=1)

        vscrollbar = Scrollbar(frame2,orient=VERTICAL)
        vscrollbar.grid(row=0, column=2, sticky=N+S)

        vscrollbar.config(command=canvas.yview)

        canvas.configure(yscrollcommand=vscrollbar.set)

        self.grid_rowconfigure(0, weight=1)
        self.rowconfigure(0, weight=1)
        self.grid_columnconfigure(0, weight=1)
        self.columnconfigure(0, weight=1)

        names = {'a','long','list','of','names','here'}
        self.makeform(frame2, names)

        Button(self, text='Quit', command=self.quit).grid(row=1, column=0, sticky=W, pady=4)

        canvas.create_window(0, 0)
        canvas.config(scrollregion=canvas.bbox(ALL))

        self.grid()

if __name__ == "__main__":

    entries = {}

    app = test(None)
    app.title('Hi ')
    app.mainloop()
更新

结合Bryan下面的示例,这适用于滚动,但在调整窗口大小时不会扩展字段。我尝试将weight=1添加到框架的第二列,但没有帮助。如何防止框架收缩

class test(Tkinter.Frame):

    def __init__(self,parent):
        Tkinter.Frame.__init__(self, root)
        self.canvas = Tkinter.Canvas(root, borderwidth=0, background="#ffffff")
        self.frame = Tkinter.Frame(self.canvas, background="#ffffff")
        self.vsb = Tkinter.Scrollbar(root, orient="vertical", command=self.canvas.yview)
        self.canvas.configure(yscrollcommand=self.vsb.set)

        self.vsb.pack(side="right", fill="y")
        self.canvas.pack(side="left", fill="both", expand=True)
        self.canvas.create_window((0,0), window=self.frame, anchor="nw",
                                  tags="self.frame")

        self.frame.bind("<Configure>", self.onFrameConfigure)

        self.populate()

    def onFrameConfigure(self, event):
        '''Reset the scroll region to encompass the inner frame'''
        self.canvas.configure(scrollregion=self.canvas.bbox("all"))

    def makeform(self, fields):
        i = 0
        for field in fields:
            Label(self.frame, text=field + ": ", anchor=W).grid(row=i)
            entry = Entry(self.frame)
            entry.grid(row=i, column=1, sticky=E+W)
            entries[field] = entry
            i += 1
        Button(self.frame, text='Quit', command=self.quit).grid(row=i, column=0, sticky=W, pady=4)


    def populate(self):
        names = {'a','long','list','of','names','here'}
        self.makeform(names)
        self.frame.columnconfigure(1, weight=1)
        self.frame.grid_columnconfigure(1, weight=1)

if __name__ == "__main__":

    entries = {}

    root=Tk()
    test(root).pack(side="top", fill="both", expand=True)
    root.mainloop()
类测试(Tkinter.Frame):
定义初始化(自身,父级):
Tkinter.Frame.\uuuuu init\uuuuu(self,root)
self.canvas=Tkinter.canvas(根,borderwidth=0,background=“#ffffff”)
self.frame=Tkinter.frame(self.canvas,background=“#ffffffff”)
self.vsb=Tkinter.Scrollbar(root,orient=“vertical”,command=self.canvas.yview)
self.canvas.configure(yscrollcommand=self.vsb.set)
自包装(side=“right”,fill=“y”)
self.canvas.pack(side=“left”,fill=“both”,expand=True)
self.canvas.create_window((0,0),window=self.frame,anchor=“nw”,
tags=“self.frame”)
self.frame.bind(“,self.onFrameConfigure)
self.populate()
def onFrameConfigure(自我,事件):
''重置滚动区域以包含内部框架''
self.canvas.configure(scrollregion=self.canvas.bbox(“全部”))
def makeform(自我,字段):
i=0
对于字段中的字段:
标签(self.frame,text=field+“:”,anchor=W).grid(row=i)
entry=entry(self.frame)
entry.grid(行=i,列=1,粘滞=E+W)
条目[字段]=条目
i+=1
按钮(self.frame,text='Quit',command=self.Quit).grid(行=i,列=0,粘性=W,pady=4)
def填充(自我):
名称={'a'、'long'、'list'、'of'、'names'、'here'}
self.makeform(名称)
self.frame.columnconfigure(1,权重=1)
self.frame.grid\u columnconfigure(1,权重=1)
如果名称=“\uuuuu main\uuuuuuuu”:
条目={}
root=Tk()
测试(根).pack(side=“top”,fill=“both”,expand=True)
root.mainloop()

您的代码中至少有三个问题

首先,要滚动的框架必须是画布的一部分。不能使用
pack
grid
将其放置在画布中,必须使用
create\u window
。您正在调用
create\u window
,但没有告诉它要添加哪个窗口

第二,滚动条是框架的子项,但我假设这些是要滚动画布的滚动条。需要在内部框架之外,也需要在画布之外

第三,需要设置与画布的
事件的绑定,以便调整内部框架的大小并重新计算画布的滚动区域

可滚动框架的完整工作示例如下: