[英]Tkinter - need a vertical scrollbar in only one window - multiple windows (frames) are within a container
我正在用Python 3.7编写一个tkinter应用程序,但是我以前从未使用过GUI,因此我经验不足。 我想将带有垂直滚动条的画布仅添加到三个窗口之一。 页面通过按钮相互连接-当我按下StartPage上的按钮时,它将带我进入PageOne,这样,我就拥有了可以将我带到不同页面的按钮。 每个页面都是主容器中的一个单独的类,根据我单击哪个按钮(PageOne,PageTwo,PageThree),使用show_frame和tkraise调出该页面。 由于所有页面都在一个容器中,因此我不知道如何在该容器中仅将滚动条实现为一个页面。 我在https://gist.github.com/bhaskar-nair2/94b2d4dd511a1cd38ecde9c9481c4b28上为滚动条找到了一段有趣的代码,但是我没有设法将其集成到我的代码中。 我只需要PageOne窗口中的滚动条。 我将非常感谢您的帮助。 这是我的代码的一部分:
import matplotlib
matplotlib.use("TkAgg")
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2Tk
from matplotlib.figure import Figure
import pandas as pd
import tkinter as tk
from tkinter import ttk
import matplotlib.pyplot as plt
import scipy as sp
import numpy as np
from matplotlib.ticker import NullFormatter
from pandas.plotting import register_matplotlib_converters
register_matplotlib_converters()
NORM_FONT = ("Helvetica", 10)
SMALL_FONT = ("Helvetica", 8)
class MyApp(tk.Tk):
def __init__(self, *args, **kwargs):
tk.Tk.__init__(self, *args, **kwargs)
tk.Tk.wm_title(self, "Data Visualisation App")
container = tk.Frame(self)
container.pack(side="top", fill="both", expand = True)
container.grid_rowconfigure(0, weight=1)
container.grid_columnconfigure(0, weight=1)
self.frames = {}
for F in (StartPage, PageOne, PageTwo, PageThree):
frame = F(container, self)
self.frames[F] = frame
frame.grid(row=0, column=0, sticky="nsew")
self.show_frame(StartPage)
def show_frame(self, cont):
frame = self.frames[cont]
frame.tkraise()
class StartPage(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self,parent)
label = tk.Label(self, text="Start Menu", font=NORM_FONT)
label.pack(pady=10,padx=10)
button1 = ttk.Button(self, text="Page 1",
command=lambda: controller.show_frame(PageOne))
button1.pack()
button2 = ttk.Button(self, text="Page 2",
command=lambda: controller.show_frame(PageTwo))
button2.pack()
button3 = ttk.Button(self, text="Page 3",
command=lambda: controller.show_frame(PageThree))
button3.pack()
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()
class PageTwo(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 1",
command=lambda: controller.show_frame(PageOne))
button2.pack()
class PageThree(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()
app = MyApp()
app.lift()
app.mainloop()
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!!!
其中VerticalScrolledFrame
是你链接的回购协议,我只是把所有的orient
和position
,以小写和字符串。
从概念上讲,按钮和滚动条的放置方式没有区别。 如果您想在PageOne
放置一些内容,则将进入PageOne
的__init__
定义,并将self
放入框架的定义中并打包。 如果您希望从另一个角度来看,则可以使用一个容器来放置GUI页面,但是这些页面是框架,因此可以用作其他对象(按钮,标签,滚动条,其他框架等)的容器。 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.