Python Tkinter-仅在一个窗口中需要一个垂直滚动条-容器中有多个窗口(框架)

Python Tkinter-仅在一个窗口中需要一个垂直滚动条-容器中有多个窗口(框架),python,python-3.x,tkinter,scrollbar,tkinter-canvas,Python,Python 3.x,Tkinter,Scrollbar,Tkinter Canvas,我正在用Python3.7编写一个tkinter应用程序,但我以前没有使用过GUI,而且我也不是很有经验。我只想在三个窗口中的一个窗口中添加一个带有垂直滚动条的画布。页面通过按钮相互连接-当我按下起始页上的按钮时,它会将我带到第一页,这样我就有了按钮,可以将我带到不同的页面。每个页面都是主容器中的一个分离类,根据我在PageOne、PageII、PageThree上单击的按钮,该页面将使用show_frame和tkraise打开。因为所有的页面都在一个容器中,所以我不知道如何实现一个滚动条,使其

我正在用Python3.7编写一个tkinter应用程序,但我以前没有使用过GUI,而且我也不是很有经验。我只想在三个窗口中的一个窗口中添加一个带有垂直滚动条的画布。页面通过按钮相互连接-当我按下起始页上的按钮时,它会将我带到第一页,这样我就有了按钮,可以将我带到不同的页面。每个页面都是主容器中的一个分离类,根据我在PageOne、PageII、PageThree上单击的按钮,该页面将使用show_frame和tkraise打开。因为所有的页面都在一个容器中,所以我不知道如何实现一个滚动条,使其只包含该容器中的一个页面。我在这里找到了一段有趣的滚动条代码,但我没有将其集成到我的代码中。我只需要在第一页窗口中有一个滚动条。我将非常感谢任何帮助。 以下是我代码的一部分:

导入matplotlib matplotlib.useTkAgg 从matplotlib.backends.backend_tkagg导入图CAVASTKAGG,导航工具栏2TK 从matplotlib.figure导入图形 作为pd进口熊猫 将tkinter作为tk导入 从tkinter导入ttk 将matplotlib.pyplot作为plt导入 将scipy作为sp导入 将numpy作为np导入 从matplotlib.ticker导入NullFormatter 从pandas.plotting导入寄存器\u matplotlib\u转换器 寄存器\u matplotlib\u转换器 NORM_FONT=Helvetica,10 小字体=Helvetica,8 类MyApptk.Tk: 定义初始自我,*args,**kwargs: tk.tk.\uuuu init\uuu self,*args,**kwargs tk.tk.wm_titleself,数据可视化应用程序 container=tk.Frameself container.packside=top,fill=both,expand=True container.grid\u rowconfigure0,权重=1 container.grid\u column配置0,重量=1 self.frames={} 对于起始页、第一页、第二页、第三页中的F: frame=Fcontainer,self self.frames[F]=帧 frame.gridrow=0,column=0,sticky=nsew self.show\u frameStartPage def显示帧自身,续: 帧=自身帧[续] 帧 类StartPagetk.Frame: 定义初始自身、父级、控制器: tk.Frame.\uuuu init\uuuu self,父 label=tk.Labelself,text=Start菜单,font=NORM\u font label.packpady=10,padx=10 button1=ttk.Buttonself,text=第1页, command=lambda:controller.show\u framePageOne 按钮1.打包 button2=ttk.Buttonself,text=Page 2, command=lambda:controller.show\u framePageTwo 按钮2.pack button3=ttk.Buttonself,文本=第3页, command=lambda:controller.show\u framePageThree 按钮3.pack 类PageOneTek.框架: 定义初始自身、父级、控制器: tk.Frame.\uuuu init\uuuu self,父 button1=ttk.Buttonself,text=返回起始页, command=lambda:controller.show_frameStartPage 按钮1.打包 button2=ttk.Buttonself,text=Page 2, command=lambda:controller.show\u framePageTwo 按钮2.pack 类PageTwotk.Frame: 定义初始自身、父级、控制器: tk.Frame.\uuuu init\uuuu self,父 button1=ttk.Buttonself,text=返回起始页, command=lambda:controller.show_frameStartPage 按钮1.打包 button2=ttk.Buttonself,text=第1页, command=lambda:controller.show\u framePageOne 按钮2.pack 类PageThreetk.Frame: 定义初始自身、父级、控制器: tk.Frame.\uuuu init\uuuu self,父 button1=ttk.Buttonself,text=返回起始页, command=lambda:controller.show_frameStartPage 按钮1.打包 app=MyApp app.lift app.mainloop 当VerticalScrolledFrame来自您链接的回购协议时,我刚刚将所有的orient和position都改为小写和字符串

从概念上讲,按钮和滚动条的放置方式没有区别。如果你想在PageOne中放置一些东西,你将进入PageOne的_uinit__;定义,并将self放入框架的定义中并打包。 如果您想从另一个角度看问题,您可以使用一个容器来放置GUI的页面,但这些页面是框架,因此可以作为其他对象按钮、标签、滚动条、其他框架等的容器

class PageOne(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)


        button1 = ttk.Button(self, text="Back to Start Page",
                            command=lambda: controller.show_frame(StartPage))
        button1.pack()

        button2 = ttk.Button(self, text="Page 2",
                            command=lambda: controller.show_frame(PageTwo))
        button2.pack()

        self.frame = VerticalScrolledFrame(self)  <--- here!!!
        self.frame.pack()  <--- here!!!