|
|
一、看下面的代码,一个简易的窗口,窗口大小996x1440:
import tkinter as tk
from tkinter import ttk, messagebox, filedialog
root = tk.Tk() #是 初始化 Tkinter 环境,并创建一个空白的、最顶层的应用程序窗口。
root.geometry("996x1440") #设置宽度、高度,单位是像素 geometry 只设置“初始大小”用户仍然可以拖动改变窗口大小(除非你禁止)
root.minsize(996, 700) #限制窗口最小尺寸
root.mainloop() #进入 GUI 事件循环(Event Loop),这一行必须是 GUI 程序的最后一行
二、复杂一点,增加了一个一级容器main_frame,在一级容器里再增加了两个容器charts_frame, table_frame :
# 创建 Tkinter 主窗口(整个 GUI 应用的根)
# root 是所有控件的“祖先容器”
root = tk.Tk()
# ================== 主容器(Main Frame) ==================
# main_frame 是放在 root 里的一级容器
# 好处:
# 1. 便于整体布局管理
# 2. 后续可以统一做 padding / theme / resize 处理
# 3. 避免直接把所有控件堆在 root 上(工程级写法)
main_frame = ttk.Frame(root)
# pack 布局说明:
# fill=tk.BOTH → 在水平方向 + 垂直方向都填满父容器
# expand=True → 当窗口变大时,main_frame 跟随一起拉伸
main_frame.pack(fill=tk.BOTH, expand=True)
# ================== 上半部分:图表区域 ==================
# charts_frame 用于承载所有图表(如 Matplotlib Canvas)
# 单独拆出来,便于:
# - 控制高度比例
# - 未来加入多图、分页、切换
charts_frame = ttk.Frame(main_frame)
# pack 参数说明:
# fill=tk.BOTH → 图表区域在 X / Y 方向都可以拉伸
# expand=True → 窗口放大时,优先扩展该区域(适合图表)
# pady=10 → 上下留出 10px 外边距,避免贴边
charts_frame.pack(fill=tk.BOTH, expand=True, pady=10)
# ================== 下半部分:表格 / 自主调节区域 ==================
# table_frame 用于承载表格、指标、控制面板等内容
# 通常高度较小,不需要占满整个窗口
table_frame = ttk.Frame(main_frame)
# pack 参数说明:
# fill=tk.X → 只在水平方向填满
# → 垂直高度由内容决定(更符合表格/控制区特性)
# pady=10 → 与上方图表区域保持视觉间距
table_frame.pack(fill=tk.X, pady=10)
三、如何适应不同屏幕,在table_frame 里展示一张图片刚好完整展示,不发生扭曲呢,这里需要计算table_frame的长宽
#计算table_frame的尺寸
def getTableWH(root):
# 原始背景图尺寸
IMG_W = 996
IMG_H = 1440
# 获取屏幕分辨率
screen_w = root.winfo_screenwidth()
screen_h = root.winfo_screenheight()
# 给 table_frame 预留一个最大可用区域
# (避免占满全屏,留点空间给 charts_frame)
MAX_TABLE_W = screen_w
MAX_TABLE_H = int(screen_h * 0.85) # 比如最多占屏幕 90% 高度
# 等比缩放计算(关键)
scale = min(
MAX_TABLE_W / IMG_W,
MAX_TABLE_H / IMG_H
)
return int(IMG_W * scale), int(IMG_H * scale)
table_w, table_h = getTableWH(root)
print("最佳尺寸:",table_w, table_h)
# 下半部分:表格 / 自主调节
table_frame = ttk.Frame(main_frame,width=table_w,height=table_h)
table_frame.pack_propagate(False)
table_frame.pack(pady=0)
#在table_frame 中添加图片
bg_img = Image.open("imagic/1_bg.png")
bg_img = bg_img.resize((table_w, table_h), Image.LANCZOS)
bg_photo = ImageTk.PhotoImage(bg_img)
bg_label = tk.Label(table_frame, image=bg_photo, bd=0)
bg_label.image = bg_photo # 防止被回收
bg_label.pack(fill=tk.BOTH, expand=True)
|
|