Python 如何将 .pack 用于其他显示器分辨率?

Python how to use .pack for an other monitor resolution?

嗨,我无法解决这个问题,我在 1920x1080 分辨率的显示器上创建了一个程序,当我 运行 它是故意在另一台分辨率为 1366x768 的电脑上时,标签的位置不同,我在一种情况下选择的高度应为 768,在另一种情况下应为 1080:

larghezza = window.winfo_screenheight()

并用于包装展示位置:

bottone_reset.pack(side=BOTTOM,anchor=S,pady=(0,altezza*0.1))
bottone_premi.pack(side=BOTTOM,anchor=S,pady=(0,altezza*0.2))
etichetta_click.pack(side=BOTTOM,anchor=S,pady=(0,altezza*0.1))
etichetta_titolo.pack(side=BOTTOM,anchor=S,pady=(0,altezza*0.1))

因为这样公式会根据当前的显示器分辨率发生变化,但标签仍然在不同的位置,如何处理?谢谢

因此,问题在于按钮和标签的位置会根据 window 大小而变化。您正在尝试根据 window 尺寸手动修改定位。虽然巧妙,但它显然没有按您的预期工作。然而,除了 pack() 之外,还有不同的选项。这些是 grid() and place()。 (链接转到“geeksforgeeks”网站,这是我目前用作参考的网站。)

'grid()' 使用列和行将元素放置在网格中,最适用于具有相同尺寸的元素(至少在您要移动的方向上)放置它们,所以如果你想让它们都在 X 方向上对齐,它们应该有相似的长度才不会看起来很奇怪)。

bottone_reset.grid(column = 0, row = 0, padx = 5, pady = 5)
bottone_premi.grid(column = 1, row = 0, padx = 5, pady = 5)
etichetta_click.grid(column = 2, row = 0, padx = 5, pady = 5)
etichetta_titolo.grid(column = 3, row = 0, padx = 5, pady = 5)

'place()' 可让您确定某物的明确位置,这可能很有用,但如果您选择元素放置可能无济于事,因为如果window缩短,位置不会改变。


我建议为列出的元素创建一个框架,然后根据对您最有用的内容,使用 pack() 或 grid() 将元素放置在该框架内。依次将该框架放在您希望按钮结束的位置。

frame.pack(side=BOTTOM, anchor = S)

bottone_reset = Button(frame,text = "reset")
bottone_premi = Button(frame, text = "premi")
etichetta_click = Label(frame, text = "click")
etichetta_titolo = Label(frame, text = "Title")

当然,您对按钮和标签的定义看起来会有所不同,这些只是占位符。


无论屏幕大小如何,以下代码始终将按钮放置在 window 的底部中央(除非所有元素不再适合)。它最接近我所看到的你试图尝试的。当然,您必须用屏幕尺寸检测替换我手动输入的 window 宽度和高度。我无法立即让它与 tkinter 一起工作,所以我决定手动更改值。

from tkinter import *

window = Tk()
window.title("Pack Problem")

windowWidth = 1000
windowHeight = 768
windowSize = str(windowWidth) + "x" + str(windowHeight)
window.geometry(windowSize)

frame = Frame()
frame.pack(side=BOTTOM, anchor = S)

bottone_reset = Button(frame,text = "reset")
bottone_premi = Button(frame, text = "premi")
etichetta_click = Label(frame, text = "click")
etichetta_titolo = Label(frame, text = "Title")

bottone_reset.grid(column = 0, row = 0, padx = 5, pady = 5)
bottone_premi.grid(column = 1, row = 0, padx = 5, pady = 5)
etichetta_click.grid(column = 2, row = 0, padx = 5, pady = 5)
etichetta_titolo.grid(column = 3, row = 0, padx = 5, pady = 5)


window.mainloop()

布局和构造显然只是占位符,但这应该作为您想要执行的操作的框架。

编辑:随着对问题的更好理解,不同的方法。原评论留给能用的人。

为了根据分辨率更改填充大小,我能想到的最快方法是将调整大小函数绑定到 window 配置。

window.bind('<Configure>', function)

可悲的是,到目前为止,试图让它顺利调整的尝试还没有成功。如果你愿意,我会把它留给你去尝试。 我开始工作的解决方案是:

def padsize(e):


    if e.height <= 1080 and e.height > 768:
        bottone_reset.grid(column=0, row=0, padx=25, pady=25)
        bottone_premi.grid(column=1, row=0, padx=25, pady=25)
        etichetta_click.grid(column=2, row=0, padx=25, pady=25)
        etichetta_titolo.grid(column=3, row=0, padx=25, pady=25)
        #print("window height is larger than 768")
    elif e.height <768 and e.height > 640:
        bottone_reset.grid(column=0, row=0, padx=15, pady=15)
        bottone_premi.grid(column=1, row=0, padx=15, pady=15)
        etichetta_click.grid(column=2, row=0, padx=15, pady=15)
        etichetta_titolo.grid(column=3, row=0, padx=15, pady=15)
        #print("window height is larger than 768")
    elif e.height <640 and e.height > 250:
        bottone_reset.grid(column=0, row=0, padx=5, pady=5)
        bottone_premi.grid(column=1, row=0, padx=5, pady=5)
        etichetta_click.grid(column=2, row=0, padx=5, pady=5)
        etichetta_titolo.grid(column=3, row=0, padx=5, pady=5)
        #print("window height is smaller than 768")
window.bind('<Configure>', padsize)

如您所见,我将焊盘尺寸差异非常大,以便能够看到变化而不需要用尺子来检查。在尺寸差异较小的情况下,它应该不会那么明显。