Насколько я знаю, окно не может обновляться без update()
до выполнения mainloop()
. Однако это можно сделать, не мигая, обновив окно, когда оно скрыто. Мы можем использовать 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 layout.
...
for i in range(20):
self.grid_rowconfigure(i, weight=1)
label = Label(self, text="label i")
label.grid(column=0, row=i)
...