2015-11-27 58 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

我認爲窗口的左上角位於中心,所以我認爲它定位該角而不是窗口的中心。 –