Вывод Tkinter отображается за пределами окна Tkinter

#python #tkinter

#python #tkinter

Вопрос:

Я запускаю программу, которая собирает данные и отображает эти данные через выходные данные (желтые) в моем пользовательском интерфейсе. Я удаляю эти выходные данные, используя Output.pack_forget() перед повторным отображением обновленных значений с помощью

 Output.insert('end',program_select)
Output.pack()
canvas.create_window(700, 300, window=Output)
 

Я продолжаю делать это для нескольких тысяч точек данных. В какой-то момент выходные данные больше не обновляются внутри окна tkinter, но отображаются в верхнем левом углу [введите описание изображения здесь] [1] моего экрана. Кажется, я не могу найти какой-либо шаблон относительно того, когда вывод появляется за пределами окна tkinter.

Мое первое подозрение заключалось в том, что я не удалял предыдущие выходные данные в окне, поэтому я добавил Output.pack_forget() , чтобы удалить их, но этот «сбой» все равно произошел.

Извините, что я еще не загрузил свой код. Моя программа довольно большая, поэтому я пытаюсь упростить свой код, чтобы дать общее представление о том, что происходит.

[Выходные данные отображаются в верхнем левом углу экрана] [1,2]

https://i.stack.imgur.com/CC5zK.png
https://i.stack.imgur.com/PlP8l.png

Ответ №1:

Для виджетов, которые вы помещаете в объект Canvas с помощью canvas.create_window, вы не должны использовать pack() или pack_forget() вообще. Когда-либо. Удалите все это.

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

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

Комментарии:

1. <Я также подозреваю, что вы создаете новые виджеты, чтобы скрыть старые вместо обновления старых.>, вы имеете в виду, что я должен использовать что-то вроде Output.insert() и root.update() вместо этого?

2. Output.delete() и Output.insert() да (при условии, что вывод представляет собой виджет ввода / текста). Альтернативой является использование текстовой переменной, которая, я уверен, была бы намного проще для вас. root.update() никогда не следует использовать (если вы действительно не знаете, что делаете, и то крайне редко).