2015-11-27 57 views
0

我正在使用此代码来中心我的屏幕,如this帖子和我的question所示,但令我惊讶的是,它并没有完全将窗口居中。它把它放在右下角而不是中心。为什么是这样?这个窗口为什么不居中?

top1=Toplevel(root) 
w = top1.winfo_screenwidth() 
h = top1.winfo_screenheight() 
topsize = tuple(int(_) for _ in top1.geometry().split('+')[0].split('x')) 
x = w/2 - topsize[0]/2 
y = h/2 - topsize[1]/2 
top1.geometry("+%d+%d" % (topsize[0]+x, topsize[1]+y)) 

由史蒂芬萨默斯

import Tkinter as tk 


def center_window(win): 
    w = win.winfo_screenwidth() 
    h = win.winfo_screenheight() 
    x = w/2 - win.winfo_width()/1-150 
    y = h/2 - win.winfo_height()/1-200 
    win.geometry("+%d+%d" % (x, y)) 

root = tk.Tk() 
top1 = tk.Toplevel(root) 
top1.title('TopLevel Window 1') 
top1.minsize(300, 300) 

b = tk.Label(top1, text='Here is a Label') 
b.pack() 
l = tk.Button(top1, text='Click Me') 
l.pack() 

top1.after(1, lambda: center_window(top1)) 

root.mainloop() 

回答

2

需要调用root.after(delay, command)运行此。当您创建小部件并尝试初始化时,大小为1x1。这就是为什么你的价值在放置时不正确的原因。同样如对所引用问题的答案所述,使用.winfo_width() and .winfo_height()而不是通过几何来获取值。

import tkinter as tk 


def center_window(win): 
    w = win.winfo_screenwidth() 
    h = win.winfo_screenheight() 
    x = w/2 - win.winfo_width()/2 
    y = h/2 - win.winfo_height()/2 
    win.geometry("+%d+%d" % (x, y)) 

root = tk.Tk() 
top1 = tk.Toplevel(root) 
top1.title('TopLevel Window 1') 
top1.minsize(300, 300) 

b = tk.Label(top1, text='Here is a Label') 

top1.after(1, lambda: center_window(top1)) 

l = tk.Button(top1, text='Click Me') 

b.pack() 
l.pack() 

root.mainloop() 
+0

不幸的是,这个解决方案不起作用。它没有给出任何错误,但将窗口放置在与之前相同的位置。 –

+0

我正在使用Python 3,并且正好运行该代码,使屏幕上的top1窗口居中。 –

+0

我在调用命令之前是否需要放置小部件? –

0

最终解决方案,我认为它应该是

top1.geometry("+%d+%d" % (x, y)) 
+0

出于某种原因,它是完全一样的。 –

+0

我认为窗口的左上角位于中心,所以我认为它定位该角而不是窗口的中心。 –