Python – TKinter – уничтожение виджетов без снижения высоты кадра

У меня возникла проблема, когда у меня есть кадр в игре, который отображает текущий ход игры (назовем этот кадр «результаты»).

Если игрок решит начать новую игру, все виджеты внутри результатов будут уничтожены, а рамка забудется скрыть ее до тех пор, пока она не будет использована снова.

Теперь проблема, с которой я сталкиваюсь; Когда результаты вызываются, они находятся между двумя другими кадрами. Однако он остался того же размера, что и в предыдущей игре, когда он содержал все виджеты до того, как виджеты были уничтожены. Виджеты не отображаются в рамке, но они по-прежнему имеют тот же размер, что и при наличии виджетов.

Как только новый виджет помещается в результаты, размер корректируется, но я не могу понять, как сделать height = 0. Я пробовал results.config(height=0), но это не сработало.

Кто-нибудь знает, как "сбросить" размер кадра до 0?

Извините за пресловутую «стену текста», но я не смог найти способ предоставить код в компактном виде.

Спасибо


person deadfire19    schedule 17.11.2013    source источник


Ответы (1)


Если я полностью понимаю, что вы хотите, то эта иллюстрация верна:

Синий – это результат фрейм.

введите здесь описание изображения

Результаты удалены, все остальное изменено:

введите здесь описание изображения

И соответствующий код для этого выглядит примерно так:

import tkinter

RESULTS_WIDTH = 128

root = tkinter.Tk()

left_frame = tkinter.Frame(root, height=64, bg='#cc3399')
right_frame = tkinter.Frame(root, height=64, bg='#99cc33')

def rem_results(event):
    # Remove widget
    results.destroy()
    # Resize other widthets
    left_frame.config(width=128 + RESULTS_WIDTH/2)
    right_frame.config(width=128 + RESULTS_WIDTH/2)
    # Reposition other widgets
    left_frame.grid(row=0, column=0)
    right_frame.grid(row=0, column=1)

def add_results(event):
    # Create results widget
    global results
    results = tkinter.Frame(root, width=RESULTS_WIDTH, height=64, bg='#3399cc')
    results.grid(row=0, column=1)
    # Resize other widgets
    left_frame.config(width=128)
    right_frame.config(width=128)
    # Reposition other widgets
    left_frame.grid(row=0, column=0)
    right_frame.grid(row=0, column=2)

# Initialize results
add_results(None)

# Bind actions to <- and -> buttons
root.bind( '<Left>', rem_results )
root.bind( '<Right>', add_results )

#$ Enter eventloop
root.mainloop()
person Peter Varo    schedule 17.11.2013
comment
Нет, я ни в коем случае не уничтожаю кадр результата. Я использую results.pack_forget(), чтобы удалить его, чтобы каждый раз не создавать фрейм. Это также позволяет избежать использования global, что не очень хорошо для использования afaik, поэтому я избегал этого. - person deadfire19; 19.11.2013
comment
Я не рекомендую вам использовать global, я сделал это только здесь, потому что в SO в вопросах tkinter мы не используем классы для решения проблемы (для облегчения понимания), только если OP предоставляет код, который использует OO. Но поскольку вы ничего не опубликовали из своего кода, мне пришлось писать его с нуля. В следующий раз вы должны создать упрощенную версию своего кода и вставить ее вместе со своим вопросом, и у вас будет лучший ответ. - person Peter Varo; 19.11.2013