在某些计算机上,带有cx_freeze的Python tkinter界面看起来非常不同(坏了)

时间:2014-12-10 14:04:07

标签: python windows python-3.x tkinter cx-freeze

我用python3.4创建了一个tkinter接口,并用cx_freeze和一个setup.py文件将其解冻。 在我的计算机(win8.1 x64)上启动程序时,我的计算机上的两个VM(Win2k8 R2 x64和Win7 Enterprise x64)和另外两个笔记本(一个Win8.1,一个Win7)看起来就像我想要的那样。

但是在其他三款笔记本电脑(Win7,Win7,Win7)上,界面看起来如此不同以至于它的损坏。 (见下面的截图)。

起初它似乎是一个Win7问题,但请注意,我有两个Win7系统,界面看起来很好。

非常感谢帮助!

我使用网格几何管理器进行布局。 这就是我实现这个小部件的方式:

tk.Label(master, text='File', width=15).grid(row=0, column=2)
tk.Label(master, text='Delimiter ( , ; \\t space )',
         width=15).grid(row=0, column=1, ipadx=5)

tk.Label(master, text='Glam', width=15).grid(row=1, column=0)
tk.Label(master, text='net.loc', width=15).grid(row=2, column=0)
tk.Label(master, text='net.dev', width=15).grid(row=3, column=0)
tk.Label(master, text='Output Folder', width=15).grid(row=4, column=0)

self.delimiter1 = tk.Entry(master, width=20)
self.delimiter1.grid(row=1, column=1)

self.delimiter2 = tk.Entry(master, width=20)
self.delimiter2.grid(row=2, column=1)

self.delimiter3 = tk.Entry(master, width=20)
self.delimiter3.grid(row=3, column=1)

self.glamPath = tk.Entry(master, width=75)
self.glamPath.grid(row=1, column=2)

self.locationPath = tk.Entry(master, width=75)
self.locationPath.grid(row=2, column=2)

self.devicesPath = tk.Entry(master, width=75)
self.devicesPath.grid(row=3, column=2)

self.outputPath = tk.Entry(master, width=96)
self.outputPath.grid(row=4, column=1, columnspan=2)

b1 = tk.Button(master, text='Open', width=15,
               command=lambda: self.openCallback(1))
b1.grid(row=1, column=3, padx=5)

b2 = tk.Button(master, text='Open', width=15,
               command=lambda: self.openCallback(2))
b2.grid(row=2, column=3, padx=5)

b3 = tk.Button(master, text='Open', width=15,
               command=lambda: self.openCallback(3))
b3.grid(row=3, column=3, padx=5)

b4 = tk.Button(master, text='Select', width=15,
               command=lambda: self.openCallback(4))
b4.grid(row=4, column=3, padx=5)

Correct 在这里,您可以看到右侧和底部的按钮是正确的。

Wrong 在这里你看到按钮没有显示......

1 个答案:

答案 0 :(得分:1)

根据评论中问题的答案,问题似乎是双重的:

  1. 带有斩断按钮的系统使用更大的字体,
  2. 您的应用程序使用固定的GUI大小,并且不准备处理更大的字体
  3. 部分解决方案是强制GUI达到特定大小。让tkinter做它最擅长的事情并调整小部件的大小以适应用户选择的任何字体。

    至于为什么这两个系统使用不同的字体,可能有几个原因。最明显的可能是具有较大字体的用户帐户只是在控制面板中选择了较大的默认字体。另一个问题可能是两个系统都使用相同的字体,但是tkinter正在以不同的方式绘制它们。 Tkinter使用它从系统获取的DPI信息来绘制字体,如果这些信息不正确,它将绘制比它们应该略大或更小的字体(例如:如果它认为显示器实际上有DPI时DPI为100 80)。

    另一个原因可能就像一个系统具有另一个没有的字体一样简单。如果两个系统都具有完全相同的OS版本,则不太可能,因为它们应该各自获得标准集。

    我可能还有其他原因没有想到。 Tkinter实际上非常善于处理这个问题,只要你决定它应该是多大的小部件。如果你能做到这一点,那么你的应用程序应该正确显示和运行,即使它在屏幕上的尺寸稍微大一点或者更小,如标尺所示。如果您经常使用place,或强制将窗口设置为特定像素大小,则您必须手动设置不同的字体大小。