class 中的 Tkinter 移动按钮有多个 windows

Tkinter moving buttons in a class for having multiple windows

我是 tkinter 的新手,我想尝试在 tkinter 中使用多个 windows。我从这里借用了代码:https://pythonprogramming.altervista.org/create-more-windows-with-tkinter/?doing_wp_cron=1645372524.8916330337524414062500 我希望能够将按钮从 window 的中间和顶部居中移动,但我不确定如何移动 window 中的按钮。我知道如何使用 pack() 通常将按钮移到 class 之外,但我不确定如何在 class 和此代码中执行此操作。当我尝试添加边或填充等属性时,window 会出现,但按钮不会出现。我到处寻找解决方案,但没有找到适合我的问题的解决方案

代码:

import tkinter as tk

class Win1:
    def __init__(self, master):
        self.master = master
        self.master.geometry("800x800")
        self.frame = tk.Frame(self.master)
        self.butnew("Click to open Window 2", "2", Win2)
        self.butnew("Click to open Window 3", "3", Win3)
        self.frame.pack()

    def butnew(self, text, number, _class):
        tk.Button(self.frame, text = text, command= lambda: self.new_window(number, _class)).pack()

    def new_window(self, number, _class):
        self.new = tk.Toplevel(self.master)
        _class(self.new, number)

class Win2:
    def __init__(self, master, number):
        self.master = master
        self.master.geometry("800x800+200+200")
        self.frame = tk.Frame(self.master)
        self.quit = tk.Button(self.frame, text = f"Quit this window n. {number}", command = self.close_window)
        self.quit.pack()
        self.frame.pack()

    def close_window(self):
        self.master.destroy()

class Win3:
    def __init__(self, master, number):
        self.master = master
        self.master.geometry("800x800+200+200")
        self.frame = tk.Frame(self.master)
        self.quit = tk.Button(self.frame, text = f"Quit this window n. {number}", command = self.close_window)
        self.quit.pack()
        self.label = tk.Label(self.frame, text="THIS IS ONLY IN THE THIRD WINDOW")
        self.label.pack()
        self.frame.pack()


    def close_window(self):
        self.master.destroy()

root = tk.Tk()
app = Win1(root)
root.mainloop()

我建议使用 .grid() 而不是 .pack(),因为它可以让您更好地控制如何放置小部件。使用 grid(),您可以选择设置列、行、padx 和 pady、粘性值以及其他值。

下面是一个使用网格在屏幕上呈现按钮的示例:

Button = Button(root, text="Button")
Button.grid(row=1, column=1)

要在使用 grid() 时将按钮居中放置在屏幕上,请添加“粘性”选项。

下面是实际使用的 stick 选项的示例:

Button = Button(root, text="Button")
Button.grid(row=1, column=1, sticky=N)

当使用粘性时,这里是您所有的选择:

  • N 北或顶部中心
  • S 南或底部中心
  • E 东或右中
  • 西西或左中
  • NW 西北或左上
  • NE 东北或右上
  • 东南或右下角
  • 西南或左下角
  • NS 垂直拉伸小部件。但是,它离开了小部件 水平居中。
  • EW 水平拉伸小部件。然而,它留下了
    小部件垂直居中。

这是一个 link 的重要资源,您可以在其中了解有关使用 grid() 的更多信息:

How to use grid() in Tkinter