【问题标题】:condensing/reducing vertical spacing between widgets in tkinter (Python) (AKA: setting vertical line/text spacing/padding)在 tkinter (Python) 中压缩/减少小部件之间的垂直间距(AKA:设置垂直行/文本间距/填充)
【发布时间】:2016-09-16 10:45:59
【问题描述】:

这是我的程序:

import tkinter as tk 

#Create main window object 
root = tk.Tk()

#build GUI
for i in range(5):
    tk.Label(root, text="hello", height=0).grid(row=i)

#mainloop
root.mainloop()

它产生以下内容(在 Xubuntu 16.04 LTS 中运行)

请注意文本行之间的所有额外垂直空间。我不想要那个!如何减少它?

如果我改为运行此代码:

import tkinter as tk 

#Create main window object 
root = tk.Tk()

#build GUI
for i in range(5):
    tk.Label(root, text="hello", height=0).grid(row=i)
    tk.Grid.rowconfigure(root, i, weight=1) #allow vertical compression/expansion to fit window size after manual resizing

#mainloop
root.mainloop()

...它打开了,最初看起来和以前完全一样,但现在我可以手动垂直拖动框以缩小它,如下所示: p>

请注意它的垂直压缩程度! 但是,我如何以编程方式进行此操作,这样我就不必手动拖动它来实现它了?我想从一开始就设置这个紧密的垂直间距,但是无论我在Labelgridrowconfigure 中更改哪些参数,如果没有我用鼠标手动拖动框,我似乎无法让它工作调整大小并垂直压缩文本。

【问题讨论】:

    标签: python tkinter spacing


    【解决方案1】:

    有很多方法可以影响垂直间距。

    当您使用gridpack 时,有填充选项(例如:padyipadyminsize)。此外,小部件本身具有许多控制其外观的选项。例如,对于标签,您可以将borderwidthhighlightthicknesspady 的值设置为零,以使小部件不那么高。

    不同的系统对这些不同的选项有不同的默认值,并且对于某些选项,默认值大于零。在尝试配置 GUI 的视觉方面时,第一步是阅读文档,并寻找影响视觉外观的选项。然后,您可以开始对它们进行试验,看看哪些可以为您提供您想要的外观。

    在您的具体情况下,这大约是您可以获得的最紧凑的:

    label = tk.Label(root, highlightthickness=0, borderwidth=0, pady=0, text="hello")
    label.grid(row=i, pady=0, ipady=0)
    

    【讨论】:

    • Bryan,请查看我对您的回答的编辑,看看是否可以接受。我添加了屏幕截图和 Nehal Wani 答案的链接,因为即使将所有宽度都最小化,我仍然无法获得我想要的控制,这使得他的技术在某些情况下是不可或缺的,也是唯一的方法。如果您可以接受我的修改,请接受,我计划通过这些修改将您的答案标记为正确。
    • Bryan,就阅读文档而言,我一直在使用 Effbot,因为我不知道 tkinter 有什么其他好的替代品。您还有其他建议吗?例如,对于gridLabel,我分别在此处(effbot.org/tkinterbook/grid.htm)和此处(effbot.org/tkinterbook/label.htm)阅读。
    【解决方案2】:

    您可以在开始主循环之前以编程方式修改几何图形,而不是手动拖动它(将 0.6 更改为您想要的任何减少百分比):

    import tkinter as tk  
    
    #Create main window object 
    root = tk.Tk()
    
    #build GUI
    for i in range(5):
        label = tk.Label(root, text = 'hello')
        label.grid(row=i)
        tk.Grid.rowconfigure(root, i, weight=1) #allow vertical compression/expansion to fit window size after manual resizing
    
    #mainloop
    root.update()
    root.geometry("{}x{}".format(root.winfo_width(), int(0.6*root.winfo_height())))
    root.mainloop()
    

    这是在带有 Python 3.5.2 的 Xubuntu 16.04 LTS 上运行的结果截图:

    【讨论】:

    • 这不是一个好的通用解决方案;它仅适用于在现实世界中不太可能出现的非常特定的情况。虽然它适用于这种非常特殊的情况,但如果有另一个您不想想要缩小的小部件,它就不会起作用。
    • @Nehal J Wani,感谢您的回答,因为我真的认为它非常有用,符合我对我的应用程序的意图,并且肯定会在我的工具包中添加另一个工具。我对它的工作方式感到非常满意。我投了赞成票。既然我也看到了 Bryan Oakley 的答案是如何工作的,我想我会将其标记为正确答案。不过,首先,让我将您的结果的屏幕截图粘贴到您的答案中。如果您可以接受我的编辑,请接受。
    • Nehal,顺便说一下,看起来update_idletasks() 比使用update() 更受欢迎。见这里:effbot.org/tkinterbook/widget.htm#Tkinter.Widget.update-method。您在示例中选择 update() 而不是 update_idletasks() 是否有某种原因?
    • @GabrielStaples 没有特别的原因。