会员登录 立即注册

搜索

窗口长宽的计算

[复制链接]
崎山小鹿 发表于 5 小时前 | 显示全部楼层 |阅读模式
崎山小鹿
5 小时前 13 1 看全部
一、看下面的代码,一个简易的窗口,窗口大小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)
天不生墨翟,万古如长夜!以墨运商,以商助墨。金双石科技长期招聘科技研发人才!微信:qishanxiaolu   电话:15876572365   公司:深圳市金双石科技有限公司
回复

使用道具 举报

 楼主| 崎山小鹿 发表于 4 小时前 | 显示全部楼层
崎山小鹿
4 小时前 看全部
如何动态设置屏幕的宽和高度
root.geometry("宽x高+X偏移+Y偏移")
需要这样设置:
w = 996
h = 1440
x = 100
y = 50

self.root.geometry(f"{w}x{h}+{x}+{y}")


隐藏窗口:
root.withdraw() = 窗口还活着,但对用户“不可见”
root.deiconify()  把一个被隐藏或最小化的 Tk 主窗口,重新显示到屏幕上

#获取父窗口的宽度
root = parent.winfo_toplevel()
    root.update_idletasks()

    W = root.winfo_width()
    print("W =", W)

root.after(100, lambda: showPage2(frame, current_data=data))  #延迟执行
天不生墨翟,万古如长夜!以墨运商,以商助墨。金双石科技长期招聘科技研发人才!微信:qishanxiaolu   电话:15876572365   公司:深圳市金双石科技有限公司
回复

使用道具 举报

  • 您可能感兴趣
您需要登录后才可以回帖 登录 | 立即注册 |

本版积分规则 返回列表

管理员给TA私信
以墨运商,以商助墨。

查看:13 | 回复:1

金双石科技,软件开发20年,技术行业领先,您的满意,就是我们的目标,认真负责,开拓进取,让成品物超所值
关于我们
公司简介
发展历程
联系我们
本站站务
友情链接
新手指南
内容审核
商家合作
广告合作
商家入驻
新闻合作

手机APP

官方微博

官方微信

联系电话:15876572365 地址:深圳市宝安区西乡街道宝民二路宝民花园 ( 粤ICP备2021100124号-1 ) 邮箱:qishanxiaolu@qq.com
QQ|Powered by Discuz! X3.5 © 2001-2025 Discuz! Team.
快速回复 返回顶部 返回列表