我想将一个 TopLevel
窗口居中,直到其父窗口的中间( Tk
或 TopLevel
窗口(。问题是我要保持窗口的动态尺寸,即.pack()
和.grid()
(TKINTER的几何经理(给予(根据需要多少尺寸的窗口尺寸尺度(。
我想这样做,而不必使用update()
,我知道这将解决我的问题,因为我不希望窗口闪烁,然后快速闪烁到本应是的位置。
这是我到目前为止的最佳尝试,问题是它可以删除 动态尺寸。
from tkinter import *
def center_to_win(window, master):
x = master.winfo_x()
y = master.winfo_y()
w = window.winfo_reqwidth()
h = window.winfo_reqheight()
total_x = x + (master.winfo_width() // 2) - (w // 2)
total_y = y + (master.winfo_height() // 2) - (h // 2)
window.geometry("%dx%d+%d+%d" % (int(w), int(h), int(total_x), int(total_y)))
class MainWin(Tk):
def __init__(self):
super(MainWin, self).__init__()
self.update()
pu = PopUp(self)
class PopUp(Toplevel):
def __init__(self, master):
super(PopUp, self).__init__(master)
for i in range(20):
label = Label(self, text="label i")
label.grid(column=0, row=i)
center_to_win(self, master)
if __name__ == '__main__':
win = MainWin()
win.mainloop()
如果有人知道该怎么做,而无需在屏幕上窗口闪光灯,那将是一个很好的帮助。:(
据我所知,在执行mainloop()
之前,没有update()
的窗口不可能进行更新。但是,可以在隐藏窗口时更新窗口,而无需刷新窗口。我们可以使用window.wm_withdraw()
隐藏和window.wm_deiconify()
来显示,至少在我的系统上并不明显延迟。window.iconify()
也可以代替window.wm_withdraw()
,但不能与transient()
一起使用。
使函数center_to_win()
的机会集中在另一个窗口上。
def center_to_win(window, master):
window.wm_withdraw()
window.update()
x = master.winfo_x()
y = master.winfo_y()
w = window.winfo_reqwidth()
h = window.winfo_reqheight()
total_x = x + (master.winfo_width() // 2) - (w // 2)
total_y = y + (master.winfo_height() // 2) - (h // 2)
window.geometry("%dx%d+%d+%d" % (int(w), int(h), int(total_x), int(total_y)))
window.wm_deiconify()
仅通过center_to_win(self, master)
调用该函数的工作正常,但是当您在启动中设置主窗口的几何形状时,我注意到一个问题可以通过调用 self.after(1, center_to_win, self, master)
的函数来修复。虽然它是非常随机的,但可能不会发生在您身上,但是如果它确实使用after(..)
。
用于动态尺寸。
尽管这解决了动态尺寸问题,但您应该将self.grid_rowconfigure(index, weight=1)
和self.grid_columnconfigure(index, weight=1)
用于 grid 布局。
...
for i in range(20):
self.grid_rowconfigure(i, weight=1)
label = Label(self, text="label i")
label.grid(column=0, row=i)
...