为了让程序窗口在不同的平台和计算机上都能良好的显示,需要考虑:
1. 窗口的大小
2. 窗口的位置
对于第一点,因为默认字体不同,应该尽量避免固定长宽,而让geometry manager(图形管理器)自己去计算所需的大小。但可以设置各个部件之间的间隙大小。
对于这一点,我还想提一下tkinter中的entry和text这两个widget,他们的height和width都是表示可以输入的英文字数,而不是像素值。只有这样,同样的文本内容,才可以在windows、linux下展现一致。而不会windows下在A处换行了,而ubuntu却在B处换行。
Tkinter的窗口屏幕居中有点烦人,没有现成的method,但我找到了一种可行的方法。简单说明:
1. 屏幕的分辨率是非常容易获取到的,直接通过root.winfo_screenwidth()、root.winfo_screenheight()
2. root = Tk(),创建窗口之后,应该立即将它隐藏,否则,我们后面的部件添加和布局过程,都会在屏幕上展现给用户,给用户的感觉就是,窗口在屏幕上乱晃了几下。
3. 完成了窗口上其他widget的创建和布局之后,使用update_idletasks()方法和deiconify()方法让geometry manger计算出所需要的窗口大小(width, height)
4. 完成第三步,窗口大小是我们所需要的大小了,但位置还不是屏幕中心。所以,接下来,将窗口再次隐藏。
5. 根据窗口大小,计算出屏幕上的位置,移动窗口后,再次让窗口可见。
上面是我目前所找到的最佳可行方法。大致的代码是:
root = Tk() root.withdraw() #hide window screen_width = root.winfo_screenwidth() screen_height = root.winfo_screenheight() - 100 #under windows, taskbar may lie under the screen root.resizable(False,False) #add some widgets to the root window... root.update_idletasks() root.deiconify() #now window size was calculated root.withdraw() #hide window again root.geometry('%sx%s+%s+%s' % (root.winfo_width() + 10, root.winfo_height() + 10, (screen_width - root.winfo_width())/2, (screen_height - root.winfo_height())/2) ) #center window on desktop root.deiconify()
补充:
1. 考虑到windows还有个任务栏,我把窗口适当靠屏幕上方显示了50像素
2. 在计算出大小之后,如果没有隐藏而直接去改变位置,会给用户一个窗口被拖动的视觉。
3. 没显示出窗口前,geometry manager不会真正去计算窗口大小,这也是为什么这里坑爹要先显示一下,再调整位置。
4. 如果窗口是fix size,事情就简单许多,直接用root.geometry()方法去改变位置即可,上面的很多代码都是多余的。
《Tkinter窗口在屏幕居中的问题》上有1条评论