【问题标题】:How to avoid a column or row size on resizing tkinter window?如何在调整 tkinter 窗口大小时避免列或行大小?
【发布时间】:2020-11-02 07:43:15
【问题描述】:

我在调整 tkinter 中的列和行框架大小时遇到​​问题。

我以 1:4 的比例划分了列和行。在调整窗口大小时,它会保持比例,但我想避免调整黑色和红色框架的大小。所以基本上,当我调整大小时,黑色和红色框架不应该增长或收缩,但所有变化都发生在白色窗口中。我怎样才能做到这一点?

代码-

import tkinter as tk
import tkinter.ttk as ttk

root = tk.Tk()
root.wm_geometry("1200x700")

root.grid_columnconfigure(0, weight=1)
root.grid_columnconfigure(1, weight=4)
root.grid_rowconfigure(0, weight=1)
root.grid_rowconfigure(1, weight=4)

f1 = tk.Frame(root, background="black", height=100, width=100)
f2 = tk.Frame(root, background="black", height=100, width=100)
f3 = tk.Frame(root, background="red", height=100, width=100)
f4 = tk.Frame(root, background="white", height=100, width=100)

f1.grid(row=0, column=0, sticky="nsew")
f2.grid(row=0, column=1, sticky="nsew")
f3.grid(row=1, column=0, sticky="nsew")
f4.grid(row=1, column=1, sticky="nsew")

root.mainloop()

【问题讨论】:

  • 只需指定黑框的高度和红框的宽度,然后将第1列和第1行的权重设置为1。
  • 这不起作用,由于 1:1 的比例,所有帧的大小都相同
  • 您是否为仅 column=1 和 row=1 设置 weight=1(即仅扩展白框)?
  • 您需要致电f3.grid_propagate(0)
  • 只需删除第 0 列和第 0 行的 grid_columnconfiguregrid_rowconfigure,这样它们将保持大小不变​​,只有第 1 行和第 1 列会调整大小

标签: python tkinter tkinter-layout


【解决方案1】:

据我了解,您想要:

  • 0 - 保持其宽度,
  • 0 - 保持其高度。

但是您的代码集配置是这样的,每次调整大小时:

  • 大小增加的 1/5 将“给予”到列 0
  • 大小增加的 4/5 将“给予”到列 1
  • 行也是如此。

使用 grid 的正确解决方案是:

  • 为列和行0保留默认权重0
  • 为列和行指定任何正宽度1

因此将代码的相应部分更改为:

root.grid_columnconfigure(1, weight=1)
root.grid_rowconfigure(1, weight=1)

【讨论】:

    【解决方案2】:

    您可以使用pack几何管理器来获取您想要的可调整大小的窗口几何形状:

    import tkinter as tk
    import tkinter.ttk as ttk
    
    root = tk.Tk()
    root.wm_geometry("1200x700")
    
    f1 = tk.Frame(root, bg="black", height=100)
    f1.pack(anchor=tk.N, fill=tk.X)
    
    f2 = tk.Frame(root)
    
    f3 = tk.Frame(f2, bg="red", width=100)
    f3.pack(anchor=tk.NW, side=tk.LEFT, fill=tk.Y)
    
    f4 = tk.Frame(f2, bg="blue", width=100, height=100)
    f4.pack(anchor=tk.NW, side=tk.LEFT, expand=True, fill=tk.BOTH)
    
    f2.pack(anchor=tk.N, side=tk.TOP, expand=True, fill=tk.BOTH)
    
    root.mainloop()
    

    【讨论】:

    • 实际上我想使用网格而不是打包或放置。在评论中得到了我的答案。谢谢你:)
    • 哦,好吧,没问题,问题中没有指定。
    猜你喜欢
    • 2012-11-17
    • 1970-01-01
    • 2011-05-18
    • 1970-01-01
    • 2012-10-09
    • 2012-08-21
    • 2017-11-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多