Python 当用户调整 window 大小时,tkinter 小部件的大小调整不均匀
Python tkinter widgets get resized uneven when user resizes the window
我正在为我的应用程序使用在 YouTube 视频中看到的模板。我使用 3 个帧将 window 分成 3 个。所有 3 个框架都嵌套在一个主框架中。主框架直接附在根window.
我正在使用包管理器将大型机放在根目录中 window。
我正在使用网格管理器将 3 个框架放置在大型机中。
我面临的问题是,当我尝试调整 window 大小时,左框架比其他 2 框架调整得更多,我不明白为什么会这样。我需要框架彼此按比例调整大小。为什么左框架比其他框架调整得更多?我该如何纠正?
import tkinter as tk
from tkinter import ttk
Normal_Font = ('Verdana', 9)
Large_font = ('Verdana', 12)
class MainApp(tk.Tk):
def __init__(self, *args, **kwargs):
tk.Tk.__init__(self, *args, **kwargs)
mainframe = tk.Frame(self)
mainframe.pack(side='top', fill='both', expand=True)
mainframe.grid_rowconfigure(0, weight=1)
mainframe.grid_columnconfigure(0, weight=1)
#mainframe.grid(row=0, column=0, sticky='nesw')
#left frame
employerframe = tk.Frame(mainframe)
employerframe.grid(row=0, column=0, sticky='nesw')
employerframe.grid_rowconfigure(0, weight=1)
employerframe.grid_columnconfigure(0, weight=1, uniform=1)
label1 = tk.Label(employerframe, text='Employer Frame', font=Large_font)
label1.grid(row=0, column=0, sticky='nesw')
ttk.Separator(mainframe, orient=tk.VERTICAL) .grid(row=0, column=1, sticky='ns')
#right frame
candidateframe = tk.Frame(mainframe)
candidateframe.grid(row=0, column=4, sticky='nesw')
candidateframe.grid_rowconfigure(0, weight=1)
candidateframe.grid_columnconfigure(0, weight=1, uniform=1)
label2 = tk.Label(candidateframe, text='Candidate Frame', font=Large_font)
label2.grid(row=0, column=0, sticky='nesw')
ttk.Separator(mainframe, orient=tk.VERTICAL) .grid(row=0, column=3, sticky='ns')
#middle frame
container = tk.Frame(mainframe)
container.grid(row=0, column=2, sticky='nesw')
container.grid_rowconfigure(0, weight=1)
container.grid_columnconfigure(0, weight=1, uniform=1)
self.frames = {}
frame = StartPage(container, self)
self.frames[StartPage] = frame
frame.grid(row=0, column=0, sticky='nesw')
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 Page', font=Large_font)
label.pack(pady=10, padx=10)
app = MainApp()
app.mainloop()
这是因为您将employerframe
、container
、candidateframe
放置到column=0
、column=2
、column=4
。但是只给 weight=1
column=0
。您还必须添加以下行以赋予列 0、2、4 相等的权重。
mainframe.grid_columnconfigure(2, weight=1)
mainframe.grid_columnconfigure(4, weight=1)
试试这个:
import tkinter as tk
from tkinter import ttk
Normal_Font = ('Verdana', 9)
Large_font = ('Verdana', 12)
class MainApp(tk.Tk):
def __init__(self, *args, **kwargs):
tk.Tk.__init__(self, *args, **kwargs)
mainframe = tk.Frame(self)
mainframe.pack(side='top', fill='both', expand=True)
mainframe.grid_rowconfigure(0, weight=1)
mainframe.grid_columnconfigure(0, weight=1)
# ----- Added lines -----
mainframe.grid_columnconfigure(2, weight=1)
mainframe.grid_columnconfigure(4, weight=1)
#left frame
employerframe = tk.Frame(mainframe)
employerframe.grid(row=0, column=0, sticky='nesw')
label1 = tk.Label(employerframe, text='Employer Frame', font=Large_font)
label1.grid(row=0, column=0, sticky='nesw')
ttk.Separator(mainframe, orient=tk.VERTICAL) .grid(row=0, column=1, sticky='ns')
#right frame
candidateframe = tk.Frame(mainframe)
candidateframe.grid(row=0, column=4, sticky='nesw')
label2 = tk.Label(candidateframe, text='Candidate Frame', font=Large_font)
label2.grid(row=0, column=0, sticky='nesw')
ttk.Separator(mainframe, orient=tk.VERTICAL) .grid(row=0, column=3, sticky='ns')
#middle frame
container = tk.Frame(mainframe)
container.grid(row=0, column=2, sticky='nesw')
self.frames = {}
frame = StartPage(container, self)
self.frames[StartPage] = frame
frame.grid(row=0, column=0, sticky='nesw')
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 Page', font=Large_font)
label.pack(pady=10, padx=10)
app = MainApp()
app.mainloop()
我正在为我的应用程序使用在 YouTube 视频中看到的模板。我使用 3 个帧将 window 分成 3 个。所有 3 个框架都嵌套在一个主框架中。主框架直接附在根window.
我正在使用包管理器将大型机放在根目录中 window。 我正在使用网格管理器将 3 个框架放置在大型机中。
我面临的问题是,当我尝试调整 window 大小时,左框架比其他 2 框架调整得更多,我不明白为什么会这样。我需要框架彼此按比例调整大小。为什么左框架比其他框架调整得更多?我该如何纠正?
import tkinter as tk
from tkinter import ttk
Normal_Font = ('Verdana', 9)
Large_font = ('Verdana', 12)
class MainApp(tk.Tk):
def __init__(self, *args, **kwargs):
tk.Tk.__init__(self, *args, **kwargs)
mainframe = tk.Frame(self)
mainframe.pack(side='top', fill='both', expand=True)
mainframe.grid_rowconfigure(0, weight=1)
mainframe.grid_columnconfigure(0, weight=1)
#mainframe.grid(row=0, column=0, sticky='nesw')
#left frame
employerframe = tk.Frame(mainframe)
employerframe.grid(row=0, column=0, sticky='nesw')
employerframe.grid_rowconfigure(0, weight=1)
employerframe.grid_columnconfigure(0, weight=1, uniform=1)
label1 = tk.Label(employerframe, text='Employer Frame', font=Large_font)
label1.grid(row=0, column=0, sticky='nesw')
ttk.Separator(mainframe, orient=tk.VERTICAL) .grid(row=0, column=1, sticky='ns')
#right frame
candidateframe = tk.Frame(mainframe)
candidateframe.grid(row=0, column=4, sticky='nesw')
candidateframe.grid_rowconfigure(0, weight=1)
candidateframe.grid_columnconfigure(0, weight=1, uniform=1)
label2 = tk.Label(candidateframe, text='Candidate Frame', font=Large_font)
label2.grid(row=0, column=0, sticky='nesw')
ttk.Separator(mainframe, orient=tk.VERTICAL) .grid(row=0, column=3, sticky='ns')
#middle frame
container = tk.Frame(mainframe)
container.grid(row=0, column=2, sticky='nesw')
container.grid_rowconfigure(0, weight=1)
container.grid_columnconfigure(0, weight=1, uniform=1)
self.frames = {}
frame = StartPage(container, self)
self.frames[StartPage] = frame
frame.grid(row=0, column=0, sticky='nesw')
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 Page', font=Large_font)
label.pack(pady=10, padx=10)
app = MainApp()
app.mainloop()
这是因为您将employerframe
、container
、candidateframe
放置到column=0
、column=2
、column=4
。但是只给 weight=1
column=0
。您还必须添加以下行以赋予列 0、2、4 相等的权重。
mainframe.grid_columnconfigure(2, weight=1)
mainframe.grid_columnconfigure(4, weight=1)
试试这个:
import tkinter as tk
from tkinter import ttk
Normal_Font = ('Verdana', 9)
Large_font = ('Verdana', 12)
class MainApp(tk.Tk):
def __init__(self, *args, **kwargs):
tk.Tk.__init__(self, *args, **kwargs)
mainframe = tk.Frame(self)
mainframe.pack(side='top', fill='both', expand=True)
mainframe.grid_rowconfigure(0, weight=1)
mainframe.grid_columnconfigure(0, weight=1)
# ----- Added lines -----
mainframe.grid_columnconfigure(2, weight=1)
mainframe.grid_columnconfigure(4, weight=1)
#left frame
employerframe = tk.Frame(mainframe)
employerframe.grid(row=0, column=0, sticky='nesw')
label1 = tk.Label(employerframe, text='Employer Frame', font=Large_font)
label1.grid(row=0, column=0, sticky='nesw')
ttk.Separator(mainframe, orient=tk.VERTICAL) .grid(row=0, column=1, sticky='ns')
#right frame
candidateframe = tk.Frame(mainframe)
candidateframe.grid(row=0, column=4, sticky='nesw')
label2 = tk.Label(candidateframe, text='Candidate Frame', font=Large_font)
label2.grid(row=0, column=0, sticky='nesw')
ttk.Separator(mainframe, orient=tk.VERTICAL) .grid(row=0, column=3, sticky='ns')
#middle frame
container = tk.Frame(mainframe)
container.grid(row=0, column=2, sticky='nesw')
self.frames = {}
frame = StartPage(container, self)
self.frames[StartPage] = frame
frame.grid(row=0, column=0, sticky='nesw')
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 Page', font=Large_font)
label.pack(pady=10, padx=10)
app = MainApp()
app.mainloop()