我只想在窗口小于其内部框架时将滚动条添加到程序的每一页。
我的程序创建一个tkinter窗口,并将程序中某一部分的内容放入框架中。当用户转到程序的另一部分时,旧的框架获取器将被销毁,而新的框架将被放入。该想法来自另一个教程,该教程目前无法找到。它是这样的:
# -*- coding: utf-8 -*-
"""
Created on Thu Jan 18 10:27:25 2019
@author: Odatas
"""
import os
try:
import Tkinter as tk
except ImportError:
import tkinter as tk
try:
import ttk
py3 = False
except ImportError:
import tkinter.ttk as ttk
py3 = True
# page classes import
from . import travel
from . import contact
from . import dangers
from . import sonstiges
from . import randomenpc
#Main Window wird gestartet.
class PTools(tk.Tk):
def __init__(self):
tk.Tk.__init__(self)
#self.geometry("%dx%d"%(self.winfo_screenwidth()+200,self.winfo_screenheight()+200))
self._frame = None
self.title("Odatas Meister Tools")
self.switch_frame(StartPage)
def switch_frame(self, frame_class):
"""Destroys current frame and replaces it with a new one."""
new_frame = frame_class(self)
if self._frame is not None:
self._frame.destroy()
self._frame = new_frame
self._frame.pack(anchor='center')
#Das Start Fenster was nach dem Starten des Tools gezeigt wird
class StartPage(ttk.Frame):
def __init__(self, master):
# Theme für Programm wird gesetzt
s = ttk.Style()
if os.name == 'nt':
s.theme_use('winnative')
ttk.Frame.__init__(self, master)
master.title("Hauptmenu")
#Frames werden geöffnet.
alles=ttk.Frame(self)
alles.pack(padx=100)
version=ttk.Frame(self)
version.pack(anchor='e')
#Ein paar Buttons
self.Name=ttk.Label(alles,text="Odatas Meistertools", font='Arial 18 bold')
self.Name.pack(pady=30)
self.Hilfe=ttk.Label(alles,text="Er haut die Alpha Versionen raus wie andere Leute die Fuffies in den Club")
self.Hilfe.pack(pady=20)
self.button1 =ttk.Button(alles, text ="Reisehelfer",command=lambda: master.switch_frame(travel.PageTravel),width=50) #command linked
self.button1.pack()
self.button2=ttk.Button(alles, text ="Monster und Wildtiere",command=lambda: master.switch_frame(dangers.PageDangers),width=50)
self.button2.pack()
#self.button5=ttk.Button(alles, text ="NPC Generator",command=lambda:master.switch_frame(randomenpc.PageRandomeNPC),width=50)
#self.button5.pack()
self.button5=ttk.Button(alles, text ="NPC Generator (In the works)",width=50)
self.button5.pack()
self.button3=ttk.Button(alles, text ="Verschiedenes",command=lambda: master.switch_frame(sonstiges.StuffPage),width=50)
self.button3.pack()
self.button4=ttk.Button(alles, text ="Kontakt",command=lambda: master.switch_frame(contact.PageContact),width=50)
self.button4.pack()
ttk.Button(alles, text="Quit", command=self.master.destroy,width=50).pack(pady=30)
self.version=ttk.Label(version,text="Version Alpha 0.21")
self.version.pack(anchor='se')
然后,我找到了有关如何添加滚动条的本教程Adding a scrollbar to a group of widgets in Tkinter。它说我需要把框架放在画布上。因此,尽管我可以将框架放置在画布中并向所有窗口添加滚动条,而不是将框架放置在窗口中。但是我不知道该怎么做以及在哪里做。我试图像这样在PTools类中进行更改:
class PTools(tk.Tk):
def __init__(self):
tk.Tk.__init__(self)
canvas = tk.Canvas(self, borderwidth=0, background="#ffffff")
frame = tk.Frame(canvas, background="#ffffff")
vsb = tk.Scrollbar(self, orient="vertical", command=canvas.yview)
canvas.configure(yscrollcommand=vsb.set)
vsb.pack(side="right", fill="y")
canvas.pack(side="left", fill="both", expand=True)
canvas.create_window((4,4), window=frame, anchor="nw")
frame.bind("<Configure>", lambda event, canvas=canvas: onFrameConfigure(canvas))
#self.geometry("%dx%d"%(self.winfo_screenwidth()+200,self.winfo_screenheight()+200))
self._frame = None
self.title("Odatas Meister Tools")
self.switch_frame(StartPage)
但这不起作用。我一开始会导入多个其他框架,这些框架对我认为的问题并不重要。我还将包括一个检查,以便仅在窗口小于我尝试添加的框架时才显示滚动条。每个框架的大小仅与几何图形管理器使之相同,才用小部件填充。我不手动设置大小。