Python 如何跨不同PPI和屏幕分辨率缩放Tkinter程序

Python 如何跨不同PPI和屏幕分辨率缩放Tkinter程序,python,python-3.x,tkinter,scale,tkinter-layout,Python,Python 3.x,Tkinter,Scale,Tkinter Layout,我一直在为某人开发一个应用程序,我们很快意识到,这个应用程序在我们的笔记本电脑之间看起来不同(在我的平板电脑上,由于ppi,它不可用)。我查找了问题所在,因此我使用启动_frame.tk.call('tk','scaling',factor)来规范所有设备的PPI。然而,我很快意识到,根据屏幕的不同,程序仍然会太大或太小(我在root.geometry(“1280x960”)设置了分辨率。为了解决所有这些问题,我创建了以下代码: root = tk.Tk() dpi = root.winfo_f

我一直在为某人开发一个应用程序,我们很快意识到,这个应用程序在我们的笔记本电脑之间看起来不同(在我的平板电脑上,由于ppi,它不可用)。我查找了问题所在,因此我使用
启动_frame.tk.call('tk','scaling',factor)
来规范所有设备的PPI。然而,我很快意识到,根据屏幕的不同,程序仍然会太大或太小(我在
root.geometry(“1280x960”)
设置了分辨率。为了解决所有这些问题,我创建了以下代码:

root = tk.Tk()
dpi = root.winfo_fpixels('1i')
factor = dpi / 72

width = root.winfo_screenwidth()
height = root.winfo_screenheight()


ratio_1 = width * height
ratio_2 = 1
r2_width = 4
r2_height = 3

while (ratio_1 / ratio_2) != 1.6875:
   r2_height = r2_width / 1.33333333333
   ratio_2 = r2_width * r2_height
   r2_width = r2_width + 1

   if (ratio_1/ratio_2) <= 1.6875:
       break
   if width + 1 == r2_width:
       break

root.geometry(str(r2_width) + "x"+ str(int(r2_height)))

starting_frame = tk.Canvas(root)

factor_multiplier = (.40*factor) +.46
factor = factor/factor_multiplier

starting_frame.tk.call('tk', 'scaling', factor)
starting_frame.place(height=int(r2_height), width = r2_width)

这只是获取设备的ppi和屏幕分辨率

ratio_1 = width * height
ratio_2 = 1
r2_width = 4
r2_height = 3

while (ratio_1 / ratio_2) != 1.6875:
    r2_height = r2_width / 1.33333333333
    ratio_2 = r2_width * r2_height
    r2_width = r2_width + 1

    if (ratio_1/ratio_2) <= 1.6875:
        break
    if width + 1 == r2_width:
        break

root.geometry(str(r2_width) + "x"+ str(int(r2_height)))
这将转换任何屏幕的ppi,以便文本和内容的大小在不同的显示器之间进行标准化(我假设为线性关系)

这只是根据我计算的新ppi和res制作一个框架和东西


虽然这样做很有效,但我所有的硬编码文本位置都会乘以我的
因子\u乘数
,这是一个非常草率且漫长的方法。请告诉我有更好的方法,因为我一直在寻找,但我找不到任何适合我需要的方法。

您是否使用
.place
将您的小部件添加到窗口?你需要将一个小部件精确地制作成特定的大小,还是只想将其制作成精确的大小?为什么你要硬编码事物的位置,而不是让python的几何管理器为你做所有的工作?@BryanOakley在我使用的一些地方。放置和它工作,但对于
next\u player\u text=next\u player\f之类的东西rame.create_text(160100,text=('Next player:\n'+player_name),fill=“#D8CF35”,font=('Calibri 25'))
或在执行
时。create_rectangle()
不能使用。place()正确吗?
ratio_1 = width * height
ratio_2 = 1
r2_width = 4
r2_height = 3

while (ratio_1 / ratio_2) != 1.6875:
    r2_height = r2_width / 1.33333333333
    ratio_2 = r2_width * r2_height
    r2_width = r2_width + 1

    if (ratio_1/ratio_2) <= 1.6875:
        break
    if width + 1 == r2_width:
        break

root.geometry(str(r2_width) + "x"+ str(int(r2_height)))
factor_multiplier = (.40*factor) +.46
factor = factor/factor_multiplier
starting_frame.tk.call('tk', 'scaling', factor)
starting_frame.place(height=int(r2_height), width = r2_width)