AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / coding / 问题 / 77671948
Accepted
Psionman
Psionman
Asked: 2023-12-17 01:59:47 +0800 CST2023-12-17 01:59:47 +0800 CST 2023-12-17 01:59:47 +0800 CST

Tkinter 允许行在窗口调整大小时填充垂直空间

  • 772

我有一个 tkinter 应用程序,包含三个主要水平区域:

  1. 标头
  2. 一系列标签和条目
  3. 一排按钮

当我水平调整窗口大小时,该应用程序运行良好:

  1. 标题保持在中心
  2. 条目扩展以填充分配的空间
  3. “保存”按钮位于左侧,“取消”按钮位于右侧

但是当我垂直调整大小时,我很高兴:

  1. 标题保持在顶部
  2. 按钮留在底部

但是,我希望条目以某种比例方式展开以填充剩余空间,而不是聚集在中心。这可能吗?

import tkinter as tk
from tkinter import ttk

PAD = 5


def _header_frame(container):
    frame = ttk.Frame(container)
    frame.grid(row=0, column=0)
    header = ttk.Label(frame, text='Header', font=('Arial', 16))
    header.grid(row=0, column=0, columnspan=2, sticky=tk.EW, padx=PAD)


def _main_frame(container):
    frame = ttk.Frame(container, style='red.TFrame')
    frame.grid(row=1, column=0, sticky=tk.EW)

    frame.rowconfigure(0, weight=1)
    frame.rowconfigure(1, weight=10)
    frame.rowconfigure(2, weight=1)

    frame.columnconfigure(0, weight=1)
    frame.columnconfigure(1, weight=5)

    label = ttk.Label(frame, text='label 1')
    label.grid(row=0, column=0, sticky=tk.NE, padx=PAD)

    entry = ttk.Entry(frame)
    entry.grid(row=0, column=1, sticky=tk.EW, padx=PAD)

    padding = ttk.Label(frame, text='')
    padding.grid(row=1, column=0)

    label = ttk.Label(frame, text='label 2')
    label.grid(row=2, column=0, sticky=tk.SE, padx=PAD)

    entry = ttk.Entry(frame)
    entry.grid(row=2, column=1, sticky=tk.EW, padx=PAD)

    padding = ttk.Label(frame, text='')
    padding.grid(row=3, column=0)

    label = ttk.Label(frame, text='label 3')
    label.grid(row=4, column=0, sticky=tk.SE, padx=PAD)

    entry = ttk.Entry(frame)
    entry.grid(row=4, column=1, sticky=tk.EW, padx=PAD)


def _button_frame(container) -> None:
    """Create button row."""
    frame = ttk.Frame(container)
    frame.grid(row=3, column=0, sticky=tk.EW, padx=PAD, pady=PAD)

    frame.columnconfigure(0, weight=1)
    frame.columnconfigure(1, weight=10)
    frame.columnconfigure(2, weight=1)

    process_button = ttk.Button(
        frame,
        text='Save',
    )
    process_button.grid(row=0, column=0, sticky=tk.W)

    padding = ttk.Label(frame, text='')
    padding.grid(row=0, column=1)

    quit_button = ttk.Button(frame, text='Quit', command=dismiss)
    quit_button.grid(row=0, column=2, sticky=tk.E)


def dismiss():
    root.grab_release()
    root.destroy()


root = tk.Tk()

# style = ttk.Style()
# style.configure('TFrame', background='yellow')
# style.configure('blue.TFrame', background='blue')
# style.configure('green.TFrame', background='green')
# style.configure('red.TFrame', background='red')

root.rowconfigure(0, weight=1)
root.rowconfigure(1, weight=10)
root.rowconfigure(2, weight=1)

root.columnconfigure(0, weight=1)

_header_frame(root)
_main_frame(root)
_button_frame(root)

root.mainloop()
tkinter
  • 1 1 个回答
  • 28 Views

1 个回答

  • Voted
  1. Best Answer
    Bryan Oakley
    2023-12-17T02:37:38+08:002023-12-17T02:37:38+08:00

    首先,您需要将根窗口的第 1 行配置为粘附到分配给它的空间的所有四个边缘。

    接下来,如果您希望将行展开,那么您需要为每一行赋予相同的非零权重。

    最后,您可能想要删除标签和条目的自定义填充,因为填充会自动发生,但如果您需要额外的填充,可以保留它。此外,您需要将该sticky值调整为相同或将其完全删除。您还可以删除用于填充的额外标签。

    就我个人而言,我发现当所有布局代码放在一起时,布局问题更容易解决。最终结果如下所示:

    def _main_frame(container):
        frame = tk.Frame(container, bg="pink")
        frame.grid(row=1, column=0, sticky=tk.NSEW)
    
        frame.rowconfigure(0, weight=1)
        frame.rowconfigure((0,1,2), weight=1)
        frame.rowconfigure(2, weight=1)
    
        frame.columnconfigure(0, weight=1)
        frame.columnconfigure(1, weight=5)
    
        label1 = ttk.Label(frame, text='label 1')
        entry1 = ttk.Entry(frame)
    
        label2 = ttk.Label(frame, text='label 2')
        entry2 = ttk.Entry(frame)
    
        label3 = ttk.Label(frame, text='label 3')
        entry3 = ttk.Entry(frame)
    
        label1.grid(row=0, column=0, sticky=tk.E)
        entry1.grid(row=0, column=1, sticky=tk.W)
    
        label2.grid(row=1, column=0, sticky=tk.E)
        entry2.grid(row=1, column=1, sticky=tk.W)
    
        label3.grid(row=2, column=0, sticky=tk.E)
        entry3.grid(row=2, column=1, sticky=tk.W)
    

    这是一个屏幕截图,其中窗口从其原始大小扩展,以便您可以看到小部件是如何均匀分布的。

    截屏

    • 1

相关问题

  • 使用 tkinter 和scrolledText,我想创建一个带有红色边框的弹出窗口

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    使用 <font color="#xxx"> 突出显示 html 中的代码

    • 2 个回答
  • Marko Smith

    为什么在传递 {} 时重载解析更喜欢 std::nullptr_t 而不是类?

    • 1 个回答
  • Marko Smith

    您可以使用花括号初始化列表作为(默认)模板参数吗?

    • 2 个回答
  • Marko Smith

    为什么列表推导式在内部创建一个函数?

    • 1 个回答
  • Marko Smith

    我正在尝试仅使用海龟随机和数学模块来制作吃豆人游戏

    • 1 个回答
  • Marko Smith

    java.lang.NoSuchMethodError: 'void org.openqa.selenium.remote.http.ClientConfig.<init>(java.net.URI, java.time.Duration, java.time.Duratio

    • 3 个回答
  • Marko Smith

    为什么 'char -> int' 是提升,而 'char -> Short' 是转换(但不是提升)?

    • 4 个回答
  • Marko Smith

    为什么库中不调用全局变量的构造函数?

    • 1 个回答
  • Marko Smith

    std::common_reference_with 在元组上的行为不一致。哪个是对的?

    • 1 个回答
  • Marko Smith

    C++17 中 std::byte 只能按位运算?

    • 1 个回答
  • Martin Hope
    fbrereto 为什么在传递 {} 时重载解析更喜欢 std::nullptr_t 而不是类? 2023-12-21 00:31:04 +0800 CST
  • Martin Hope
    比尔盖子 您可以使用花括号初始化列表作为(默认)模板参数吗? 2023-12-17 10:02:06 +0800 CST
  • Martin Hope
    Amir reza Riahi 为什么列表推导式在内部创建一个函数? 2023-11-16 20:53:19 +0800 CST
  • Martin Hope
    Michael A fmt 格式 %H:%M:%S 不带小数 2023-11-11 01:13:05 +0800 CST
  • Martin Hope
    God I Hate Python C++20 的 std::views::filter 未正确过滤视图 2023-08-27 18:40:35 +0800 CST
  • Martin Hope
    LiDa Cute 为什么 'char -> int' 是提升,而 'char -> Short' 是转换(但不是提升)? 2023-08-24 20:46:59 +0800 CST
  • Martin Hope
    jabaa 为什么库中不调用全局变量的构造函数? 2023-08-18 07:15:20 +0800 CST
  • Martin Hope
    Panagiotis Syskakis std::common_reference_with 在元组上的行为不一致。哪个是对的? 2023-08-17 21:24:06 +0800 CST
  • Martin Hope
    Alex Guteniev 为什么编译器在这里错过矢量化? 2023-08-17 18:58:07 +0800 CST
  • Martin Hope
    wimalopaan C++17 中 std::byte 只能按位运算? 2023-08-17 17:13:58 +0800 CST

热门标签

python javascript c++ c# java typescript sql reactjs html

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve