Удаление кнопки Tkinter - PullRequest
       22

Удаление кнопки Tkinter

0 голосов
/ 26 марта 2020

Всякий раз, когда я использую функцию destroy () для удаления кнопки в tkinter, все остальные виджеты в окне tkinter gui под этой кнопкой сдвигаются вверх, создавая зазор в нижней части моего экрана. Я не хочу, чтобы это случилось. Есть ли способ предотвратить смещение виджетов после удаления кнопки? Также обратите внимание, что я должен поместить кнопки в метку, которая вставлена ​​в рамку, и эта рамка находится в главном окне gui. Это ограничения.

enter code here

from tkinter import *
screen = Tk()
screen.title("Kaun Banega Crorepati - The Game")
screen.geometry('1920x1080+0+0')
gameframe = Frame(screen, bg='#2e004d',width=1920,height=1080)
gameframe.pack()
panel = Label(gameframe, bg='#2e004d', width=1920, height=1080)
panel.pack()

def cmd():
    optionc.destroy()


optiona = Button(panel, text='A.option', font='Arial 18 bold', bg='black', 
fg='yellow')
optiona.pack(side='top', padx=40,pady=20)

optionb = Button(panel, text='B.option', font='Arial 18 bold', bg='black', 
fg='yellow')
optionb.pack(side='top', padx=40,pady=20)

optionc = Button(panel, text='C.option', font='Arial 18 bold', bg='black', 
fg='yellow')
optionc.pack(side='top', padx=40,pady=20)

optiond = Button(panel, text='D.option', font='Arial 18 bold', bg='black', 
fg='yellow')
optiond.pack(side='top', padx=40,pady=20)

destroybutton=Button(panel,text='destroy',font='Arial 18 bold', bg='black', 
fg='yellow',border=5,command=cmd)
destroybutton.pack(side='top', padx=40,pady=20)


screen.mainloop()

1 Ответ

0 голосов
/ 27 марта 2020

Вопрос : предотвращение смещения виджетов после удаления кнопки

Вместо использования Pack Geometry Manager , который является динамическим c, используйте Place Geometry Manager .

Точка ядра :

.place(x=..., y=...)

enter image description here enter image description here


Ссылка :

  • 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

...