Вопрос : предотвращение смещения виджетов после удаления кнопки
Вместо использования Pack Geometry Manager , который является динамическим c, используйте Place Geometry Manager .
Точка ядра :
.place(x=..., y=...)
Ссылка :
- Tkinter Place Geometry Manager
Позволяет вам явно установить положение и размер виджетов, либо в абсолютном выражении или относительно другого виджета.
Примечание : я рекомендую использовать tk.Frame
в качестве контейнера, но вы также можете изменить на tk.Label
.
Определить класс контейнера FixedPanel(tk.Frame)
.
Расширить с помощью:
button=
: Последовательность tuple(text, command)
def button(text)
: Возвращает ссылка на Button
, которая соответствует text
.
import tkinter as tk
class FixedPanel(tk.Frame):
def __init__(self, parent, **kwargs):
items = kwargs.pop('button', None)
super().__init__(parent, **kwargs)
for n, (text, command) in enumerate(items):
button = tk.Button(self, text=text, command=command,
font='Arial 18 bold', bg='black', fg='yellow')
button.place(x=20, y=(n * 60) + 20)
def button(self, text):
for child in list(self.children):
button = self.nametowidget(child)
if button['text'] == text:
return button
Использование :
Используйте class FixedPanel
как любое другое tkinter
widget.
To .destroy()
a Button
, получите ссылку Button
, используя panel.button(<text>)
class App(tk.Tk):
def __init__(self):
super().__init__()
self.title("Kaun Banega Crorepati - The Game")
self.geometry('800x500+0+0')
self.panel = FixedPanel(self, bg='red', width=170, height=350,
button=(('A.option', None),
('B.option', None),
('C.option', None),
('D.option', None),
('destroy', self.cmd))
)
self.panel.pack()
def cmd(self):
self.panel.button('C.option').destroy()
if __name__ == "__main__":
App().mainloop()
Протестировано с Python: 3,5 - ' TclVersion ': 8,6' TkVersion ': 8,6