У меня есть этот очень простой код
from tkinter import *
class GUI(Tk):
def __init__(self):
super().__init__()
self.geometry('600x400')
Button(self, text = "Show new window", command=self.show_window).pack()
def show_window(self):
smallwin = display()
class display(Toplevel):
def __init__(self):
super().__init__()
self.geometry('300x300+30+30')
self.attributes('-topmost',True)
root = GUI()
root.mainloop()
` При нажатии на кнопку появляется дочернее окно. Когда вы нажимаете ее снова, появляется второе дочернее окно и т. д. и т. д., НО каждое новое окно находится справа и ниже от последнего.
Я хотел бы знать, можно ли отключить это автоматическое поведение?
Полный код сохраняет геометрию каждого окна при перемещении и изменении размера пользователем. Эти геометрии используются при перезапуске программы, чтобы вернуть дочерние окна туда, где они были у пользователя, за исключением того, что все они получают «смещение», добавленное к их соответствующим геометриям. Просто раздражает, а не разрушает землю
Итак... вы даже не включили код, где ошибка?
Все, я ценю ваши комментарии, но я боюсь, что моя точка зрения была упущена. В фрагменте кода есть одна очевидная ошибка, и спасибо, что указали на нее. Эта ошибка заключается в том, что строка self.defaultgeometry(300x300+30+30) должна на самом деле читать self.geometry(300x300+30+30). с этим изменением вы ожидаете, что все эти дочерние окна будут отображаться друг над другом. Я умоляю вас попробовать это. На моем MAC они расположены в шахматном порядке, как показано на снимке экрана. Это то, что я пытался объяснить и найти объяснение.
вы можете просто установить расположение окна. Тогда все окна откроются именно в этом месте.
Например.
root.geometry('250x150+0+0')
Более подробно решения описаны здесь:
Как указать, где открывается окно Tkinter?
Ну, это то, чего вы ожидаете, и это, безусловно, то, что я сделал, однако, как я уже упоминал в своем комментарии выше, это не то, что происходит. Дочерние окна перемещаются в назначенные позиции, но к этим настройкам добавляется смещение. Откуда берется смещение? Питон? Ткинтер? MacOS? Вы видите тот же эффект на MAC, когда открываете изображения в Preview, они расположены в шахматном порядке, чтобы вы могли их видеть. Могу ли я добавить полный код здесь где-нибудь?
вы можете добавить ссылку на репозиторий (если он у вас есть где-то на github)
Если вы явно установите геометрию для каждого окна, они будут идти туда, куда вы им скажете.
Кажется, вы устанавливаете геометрию, но не используете ее. Если вы передадите это значение методу geometry
, окно переместится именно в это место.
class display(Toplevel):
def __init__(self):
super().__init__()
self.defaultgeometry='300x300+30+30'
self.wm_geometry(self.defaultgeometry)
...
Спасибо, вы абсолютно правы, но если я изменю эту ошибочную строку геометрии на обычную, т.е. self.geometry(300x300+30+30) и запущу код, я все равно получу окна в шахматном порядке. Я предполагаю, что это дело в MAC OS, и просто хотел бы знать. Пожалуйста, смотрите мой другой комментарий выше.
Ах, нет, извините всех. Я закрываю вопрос, спасибо за вашу помощь
@brian: я протестировал этот код на своем Mac, и он отлично работает.
Что значит выключен? Что вы хотите, чтобы произошло при создании нового окна?