Tkinter窗口在屏幕居中的问题

为了让程序窗口在不同的平台和计算机上都能良好的显示,需要考虑:

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条评论

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注