我一直在为某人开发一个应用程序,我们很快意识到该应用程序在我们的笔记本电脑之间看起来不同(并且在我的平板电脑上它因为 ppi 而无法使用)。我查找了问题所在,因此我习惯于 starting_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)
让我分解一下:
dpi = root.winfo_fpixels('1i')
factor = dpi / 72
width = root.winfo_screenwidth()
height = root.winfo_screenheight()
这只是抓取设备的 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)))
这基本上采用了我的 16x9 显示器,并找到了一个 4:3 的分辨率,它是我屏幕分辨率的 88% 左右(我只是认为它的尺寸很好,而且我的程序是基于此的)。
factor_multiplier = (.40*factor) +.46
factor = factor/factor_multiplier
这会转换任何屏幕的 ppi,以便文本和内容的大小在显示器上标准化(我假设一个线性关系)。
starting_frame.tk.call('tk', 'scaling', factor)
starting_frame.place(height=int(r2_height), width = r2_width)
这只是根据我计算的新 ppi 和 res 制作框架和东西。
虽然这种排序有效,然后我所有的硬编码文本位置都乘以 my factor_multiplier
,但这是一种非常草率且漫长的方法。请告诉我有更好的方法,因为我一直在寻找,但找不到任何适合我需要的东西。