中心台式窗口,保持网格/包装几何形状的动态尺寸



我想将一个 TopLevel窗口居中,直到其父窗口的中间( TkTopLevel窗口(。问题是我要保持窗口的动态尺寸,即.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)
...

最新更新