【问题标题】:Is there an inherent difference in Tkinter grid column spacing on MacOS vs Windows? If so, how do I get around that?MacOS 与 Windows 上的 Tkinter 网格列间距是否存在固有差异?如果是这样,我该如何解决?
【发布时间】:2021-08-18 02:36:48
【问题描述】:

我一直在浏览一些 tkinter 视频教程和文档,试图通过网格布局来解决间隔问题,以便将其用于我自己的应用程序,但是当我尝试使用网格间距时,它似乎添加了我没有编码的额外间距/填充。

我对此研究得越多,它就越像是 MacOS 与 Windows 的问题,但如果是这样的话,有人知道解决方法吗?

例如,我尝试复制并粘贴此链接中的计算器代码:https://zetcode.com/tkinter/layout/,我得到了两个截然不同的结果。

顶部图片是示例页面中的图片,看起来像是在 Windows 上完成的,而底部图片是我复制/粘贴代码并自己尝试时发生的。

这个间距并没有那么不好,如果我必须处理它,我想我会这样做,但是当我从视频教程中尝试下面的代码时,我的布局的间距大不相同。

我也链接了视频,因为在某一时刻,编码员遇到了一些相似的间距,但随后对其进行了修复,并且输入相同的代码对我来说并没有导致相同的修复。

from tkinter import *

root=Tk()
root.title("Simple Calculator")

e = Entry(root, width=35, borderwidth=5)
e.grid(row=0, column=0, columnspan=3, padx=10, pady=10)

def button_click(number):
    #e.delete(0, END)
    e.insert(0, number)

# Define Buttons

button_1 = Button(root, text="1", padx=40, pady=20, command=lambda: button_click(1))
button_2 = Button(root, text="2", padx=40, pady=20, command=lambda: button_click(2))
button_3 = Button(root, text="3", padx=40, pady=20, command=lambda: button_click(3))
button_4 = Button(root, text="4", padx=40, pady=20, command=lambda: button_click(4))
button_5 = Button(root, text="5", padx=40, pady=20, command=lambda: button_click(5))
button_6 = Button(root, text="6", padx=40, pady=20, command=lambda: button_click(6))
button_7 = Button(root, text="7", padx=40, pady=20, command=lambda: button_click(7))
button_8 = Button(root, text="8", padx=40, pady=20, command=lambda: button_click(8))
button_9 = Button(root, text="9", padx=40, pady=20, command=lambda: button_click(9))
button_0 = Button(root, text="0", padx=40, pady=20, command=lambda: button_click(0))
button_add = Button(root, text="+", padx=39, pady=20, command=lambda: button_click(7))
button_equal = Button(root, text="=", padx=98, pady=20, command=lambda: button_click(7))
button_clear = Button(root, text="clear", padx=88, pady=20, command=lambda: button_click(7))

# Put the buttons on the Screen

button_1.grid(row=3, column=0)
button_2.grid(row=3, column=1)
button_3.grid(row=3, column=2)

button_4.grid(row=2, column=0)
button_5.grid(row=2, column=1)
button_6.grid(row=2, column=2)

button_7.grid(row=1, column=0)
button_8.grid(row=1, column=1)
button_9.grid(row=1, column=2)

button_0.grid(row=4, column=0)
button_add.grid(row=5, column=0)

button_equal.grid(row=5, column=1, columnspan=2)
button_clear.grid(row=4, column=1, columnspan=2)


root.mainloop()

第一张图片是我的,第二张是编码员/YouTuber 的。在构建 UI 时,列之间的间距/填充似乎太多了,无法“处理”。有人有解决方法吗?我想要具有明显 Windows 布局/间距的更简洁、更简洁的外观。

【问题讨论】:

  • 您知道padx 的值以像素为单位吗?所以它取决于显示分辨率,youtuber应该已经解释了。
  • 仍在尝试这些。发现我的 python 版本有其他问题,所以我也在尝试解决这个问题。
  • 这应该是这个问题的答案的一部分吗?我不这么认为
  • 抱歉,我好像是在回复要求选择正确答案的评论。
  • 也许你应该接受一些东西,问题询问差异,两个值都提到它。值得回复他们,因为他们花时间在你的问题上

标签: python tkinter padding


【解决方案1】:

padxpady 取决于您的屏幕分辨率(您应该查找每个小部件的方法),因为大小以像素为单位。 你也许可以玩放置,有 3 种方法可以在 tkinter 中放置按钮、标签等。 grid(),pack(),place()。您应该使用您觉得舒服并适合您需要的那个。你可以试试这样的:

from tkinter import *

root=Tk()
root.title("Simple Calculator")

e = Entry(root, width=35, borderwidth=5)
e.grid(row=0, column=0, columnspan=3, padx=10, pady=10)

def button_click(number):
    #e.delete(0, END)
    e.insert(0, number)

# Define Buttons

button_1 = Button(root, text="1", padx=40,pady=20,command=lambda: button_click(1))

#Place Buttons

button_1.place(relx=FLOAT,rely=FLOAT,relheight=FLOAT,relwidth=FLOAT)



root.mainloop()

relxrely 是 水平和垂直偏移为 0.0 和 1.0 之间的浮点数,作为父小部件的高度和宽度的一部分。因此,您可以通过位置调整与主窗口相关的小部件。 (relheightrelwidth遵循相同的原则) https://www.tutorialspoint.com/python/tk_place.htm

【讨论】:

  • “在 tkinter 中几乎所有与尺寸、高度/宽度/x/y 相关的东西都相同...” ~ 不完全准确。按钮、标签、条目...接受不是像素的width/height
  • @CoolCloud 已编辑,您是对的,这取决于您使用的小部件。 (例如按钮:宽度是字母(如果显示文本)或像素(如果显示图像)的按钮宽度)
【解决方案2】:

如果标题是您的问题,那么不,Windows 和 macOS 之间没有重大区别。但大小取决于您正在查看的显示分辨率。

例如,第一张图片是在不同的分辨率下完成的,第二张也是如此。您应该尝试使用padxpady 以使其适合您的分辨率。

padxpady 在默认情况下始终是像素,因此在不同的分辨率下(屏幕分辨率也是像素)会根据值有所不同。

在 macOS big sur 11.3.1 1920x1080 上尝试代码时的图像:

在 macOS big sur 但 1440x990 的 @roganjosh 上尝试代码时的图像:

如您所见,它是 macOS 本身,但是当您检查按钮的宽度时,结果再次不同,与 youtuber 在 Windows 中得到的非常相似。

但此外,您可以看到图像之间的水平距离也在操作系统之间发生变化。

【讨论】:

    【解决方案3】:

    使用 padx 和 pady = 0

    .grid(padx = 0,pady=0)

    这应该会减少两者之间的间距,并且看起来像所需的图片

    【讨论】:

    • 这个效果最好!它极大地关闭了空间,而对我的代码结构的改动很小。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-15
    • 1970-01-01
    • 1970-01-01
    • 2022-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多