我的按钮并排放置在我的主页 window 中,但它们出现在中间。我如何让他们更上一层楼?

My buttons sit side by side in my Home window but they appear in the middle. How do I get them higher up?

我的商店 class 也遇到了类似的问题。我的第一个按钮 (Teapops) 是我希望主页 window 和商店 window 上的所有按钮(除了返回主页)的位置,如果我使用:

      button1.pack(side=TOP, anchor=NW, padx=10, pady=60, expand=NO)
      button2.pack(side=TOP, anchor=NW, padx=30, pady=60, expand=NO)
      button3.pack(side=TOP, anchor=NW, padx=60, pady=60, expand=NO)

但是其他所有的都显得越来越低,我不知道为什么除了我的框架有问题吗?

如果我用这个,

      button1.pack(side=LEFT, anchor=NW, fill=BOTH, expand=1)
      button2.pack(side=LEFT, anchor=NW, fill=BOTH, expand=1)
      button3.pack(side=LEFT, anchor=NW, fill=BOTH, expand=1)

然后我的所有按钮并排出现,但再次出现在屏幕中间,就像在我的主屏幕上一样:

谁能给我解释一下这是怎么回事?我认为我不了解有关框架的一些基础知识。请帮忙!!!!

import Tkinter as tk   
from Tkinter import *

TITLE_FONT = (“Helvetica”, 18, “bold”)
CREDITS_FONT = (“Helvetica”, 12, “bold”)

class App(tk.Tk):

  def __init__(self, *args, **kwargs):
      tk.Tk.__init__(self, *args, **kwargs)

      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 (Home, My_Plnts, Jrnl, Shop, Mail):
          page_name = F.__name__
          frame = F(parent=container, controller=self)
          self.frames[page_name] = frame

          frame.grid(row=0, column=0, sticky=“nsew”)

      self.show_frame(“Home”)

  def show_frame(self, page_name):

      frame = self.frames[page_name]
      frame.tkraise()

class Home(tk.Frame):

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

      Home.configure(self, background=’#ade5ad’)

      label = tk.Label(self, text=“Welcome Home, Maebert!”, background=’#ade5ad’, font=TITLE_FONT)
      label.pack(side=“top”, fill=“x”, pady=10)

      button1 = tk.Button(self, text=“My Plnts”,
                          command=lambda: controller.show_frame(“My_Plnts”))
      button2 = tk.Button(self, text=“Jrnl”,
                          command=lambda: controller.show_frame(“Jrnl”))
      button3 = tk.Button(self, text=“Shop”,
                          command=lambda: controller.show_frame(“Shop”))
      button4 = tk.Button(self, text=“Mail”,
                          command=lambda: controller.show_frame(“Mail”))
      button1.pack(side=LEFT, padx=60)
      button2.pack(side=LEFT, padx=60)
      button3.pack(side=LEFT, padx=60)
      button4.pack(side=LEFT, padx=60)

class My_Plnts(tk.Frame):

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

      My_Plnts.configure(self, background=’#ade5ad’)

      label = tk.Label(self, text=“My Plnts”, background=’#ade5ad’, font=TITLE_FONT)
      label.pack(side=“top”, anchor=NW, fill=“x”, pady=10)
      button = tk.Button(self, text=“Back to Home”,
                         command=lambda: controller.show_frame(“Home”))
      button.pack(side=“top”, anchor=NE)

class Jrnl(tk.Frame):

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

      Jrnl.configure(self, background=’#ade5ad’)

      label = tk.Label(self, text=“Jrnl”, background=’#ade5ad’, font=TITLE_FONT)
      label.pack(side=“top”, fill=“x”, pady=10)
      button = tk.Button(self, text=“Back to Home”,
                         command=lambda: controller.show_frame(“Home”))
      button.pack(side=“top”, anchor=NE)

class Shop(tk.Frame):

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

      Shop.configure(self, background=’#ade5ad’)

      label = tk.Label(self, text=“Shop”, background=’#ade5ad’, font=TITLE_FONT)
      label.pack(side=“top”, fill=“x”, pady=10)

      label = tk.Label(self, text=“More at www.gfc.com”, background=’#ade5ad’, font=CREDITS_FONT)
      label.pack(side=“bottom”, fill=“x”, pady=10)

      button = tk.Button(self, text=“Back to Home”,
                         command=lambda: controller.show_frame(“Home”))

      button1 = tk.Button(self, text=“Teapops”,
                          command=lambda: controller.show_frame(“Teapops”))
      button2 = tk.Button(self, text=“Plants”,
                          command=lambda: controller.show_frame(“Plants”))
      button3 = tk.Button(self, text=“Nail Polish”,
                          command=lambda: controller.show_frame(“Nail_Polish”))

      button.pack(side=“top”, anchor=NE)

      button1.pack(side=LEFT, anchor=NW, fill=BOTH, expand=1)
      button2.pack(side=LEFT, anchor=NW, fill=BOTH, expand=1)
      button3.pack(side=LEFT, anchor=NW, fill=BOTH, expand=1)

      “”“
      button1.pack(side=TOP, anchor=NW, padx=10, pady=60, expand=NO)
      button2.pack(side=TOP, anchor=NW, padx=30, pady=60, expand=NO)
      button3.pack(side=TOP, anchor=NW, padx=60, pady=60, expand=NO)
”“”

class Mail(tk.Frame):

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

      Mail.configure(self, background=’#ade5ad’)

      label = tk.Label(self, text=“Mail”, background=’#ade5ad’, font=TITLE_FONT)
      label.pack(side=“top”, fill=“x”, pady=10)
      button = tk.Button(self, text=“Back to Home”,
                         command=lambda: controller.show_frame(“Home”))
      button.pack(side=“top”, anchor=NE)

if __name__ == “__main__”:
  app = App()
  app.minsize(300,300)
  app.geometry(“800x800”)
  app.mainloop()

我构建了以下程序来向您演示 .pack() 方法的工作原理,请随意尝试不同的选项,看看每个选项如何影响输出:

from tkinter import *

root = Tk()
top = Toplevel()
top.withdraw()
var1 = StringVar(root)
var1.set("top")
var2 = StringVar(root)
var2.set("none")
var4 = StringVar(root)
var4.set("center")
var3 = BooleanVar(root)

def command(top, var1, var3, var2):
    top.destroy()
    top = Toplevel()
    top.geometry("500x500")
    Label(top, text="Welcome home").pack()
    Button(top, text="Button1").pack(side=var1.get(), fill=var2.get(), expand=var3.get(), anchor=var4.get())
    Button(top, text="Button2").pack(side=var1.get(), fill=var2.get(), expand=var3.get(), anchor=var4.get())
    Button(top, text="Button3").pack(side=var1.get(), fill=var2.get(), expand=var3.get(), anchor=var4.get())
    Button(top, text="Button4").pack(side=var1.get(), fill=var2.get(), expand=var3.get(), anchor=var4.get())

option1 = OptionMenu(root, var1, "top", "left", "bottom", "right")
check1 = Checkbutton(root, variable=var3, text="Expand?")
option2 = OptionMenu(root, var2, "none", "x", "y", "both")
option3 = OptionMenu(root, var4, "center", "n", "ne", "e", "se", "s", "sw", "w", "nw")
button1 = Button(root, text="Render", command=lambda:command(top, var1, var3, var2))

option1.pack()
check1.pack()
option2.pack()
option3.pack()
button1.pack()

root.mainloop()

这应该向您展示不同的选项如何影响 .pack() 的结果。

更重要的是,我相信使用 .pack(side="left", expand="true", fill="x", anchor="n").

可以达到您想要的效果