如何在不移动其他小部件的情况下在 tkinter 中 show/hide 小部件

how to show/hide widget in tkinter without moving other widget

我正在使用 grid_remove()grid() 命令来 hide/show 小部件,但结果是另一个小部件移出了原来的位置。

如何在不移动小部件的情况下hide/show小部件

示例:

from tkinter import *
from tkinter import ttk


GUI = Tk()
GUI.title("myTest")
GUI.geometry("700x700")

Nameget = StringVar()
Priceget = StringVar()
Quantityget = StringVar()
Unitget = StringVar()
Partnumget = StringVar()

L_Partnum = ttk.Label(GUI, text = 'Part number')
L_Partnum.grid(row = 0, column = 0)

L_namme = ttk.Label(GUI, text = 'Name')
L_namme.grid(row = 0, column = 1)

L_quan = ttk.Label(GUI, text = 'Quantity')
L_quan.grid(row = 1, column = 2)
L_quan.grid_remove()

L_price = ttk.Label(GUI, text = 'Price')
L_price.grid(row = 3, column = 3)

E_partnum = ttk.Entry(GUI, textvariable = Partnumget)
E_partnum.grid(row = 1, column = 0)

E_namme = ttk.Entry(GUI,textvariable = Nameget)
E_namme.grid(row = 1, column = 1)

E_unit = ttk.Entry(GUI,textvariable = Unitget)

E_quan = ttk.Entry(GUI,textvariable = Quantityget)
E_quan.grid(row = 2, column = 2)
E_quan.grid_remove()

E_price = ttk.Entry(GUI,textvariable = Priceget)
E_price.grid(row = 4, column = 3)

I_check_vat = IntVar()

def d_check_vat_1():
    E_partnum.focus()
    if I_check_vat.get() == 1:
        L_quan.grid()
        E_quan.grid()
    elif I_check_vat.get() == 0:
        L_quan.grid_remove()
        E_quan.grid_remove()

C_CHECK_VAT = ttk.Checkbutton(GUI, text="click here to see the result", variable=I_check_vat, command=d_check_vat_1)
C_CHECK_VAT.grid(row = 5, column = 0)

GUI.mainloop()

点击前:

点击后:

具有预期输出的图像:

问题是 grid() 默认情况下不占用空 space,它将最后一个空 row/col 提供给小部件(如果它之前的前几行是空的)。

所以你可以做的是,为你的列和行设置最小值 space,这样 space 将保持为空,所以将你的函数更改为:

def d_check_vat_1():
    E_partnum.focus()
    if I_check_vat.get():
        L_quan.grid(row=2, column=2)
        E_quan.grid(row=3, column=2)
        GUI.update() # To update the values
        
        width = E_quan.winfo_width() # Get widget width
        height = L_quan.winfo_height() # Get widget height
        
        GUI.rowconfigure(2,minsize=height) # Now apply the values
        GUI.rowconfigure(3,minsize=height)
        GUI.columnconfigure(2,minsize=width)
    
    else:
        L_quan.grid_remove()
        E_quan.grid_remove()

现在它也是动态的,它采用小部件的宽度并将其应用为该行的 minsize,以便该行将具有空 space。