Форма Tkinter отстает в отображении данных при прокрутке

У меня есть небольшое приложение с графическим интерфейсом с Tkinter. очень просто код получает список параметров и показывает их пользователю как флажок и ожидает выбора пользователя. для выполнения своей задачи я поместил холст и рамку внутри него, а затем привязал полосу прокрутки к холсту. Кроме того, поскольку у меня было неизвестное количество флажков, я сначала поместил их все в метку, а затем поместил метку на свой кадр. все работает и полоса прокрутки тоже. но есть небольшая проблема, а именно: когда я открываю окна, у меня есть список в форме, но когда я прокручиваю, они имеют «отставание» и не отображаются в моей форме, НО они отображаются как я парить мышь на области. (как классическое замерзание окон).

Код:

class StartPage(tk.Frame):
testListOut = []
def __init__(self, parent, controller):
    tk.Frame.__init__(self, parent)
    self.testList = []
    self.canvas = tk.Canvas(self, borderwidth=2, relief = "sunken")
    self.frame = tk.Frame(self.canvas)
    self.scrollbar = tk.Scrollbar(self.canvas, orient = "vertical", command=self.canvas.yview)
    self.canvas.configure(yscrollcommand=self.scrollbar.set)
    self.scrollbar.pack(side = "right", fill = "y")
    self.canvas.pack(side = "top", fill = "both" ,expand = "true")
    self.canvas.create_window((4, 4), window=self.frame, anchor = "nw",tags = "self.frame")
    self.frame.bind("<Configure>", self.onFrameConfigure)
    self.populateCheckBox(lNames)
    
def populateCheckBox(self ,testList):
    self.checks = []
    self.vars = []
    label = tk.Label(self.frame , width=3, borderwidth = "1")
    label.pack()
    for element in testList:
        var = tk.BooleanVar()
        var.set(False)
        checkbox = tk.Checkbutton(label, relief = "flat")
        checkbox["text"] = element
        checkbox["command"] = lambda: self.handler(testList)
        checkbox["variable"] = var
        checkbox.grid(sticky = "w",  padx = "10", pady = "5")
        self.checks.append(checkbox)
        self.vars.append(var)
        
def onFrameConfigure(self, event):
    self.canvas.configure(scrollregion=self.canvas.bbox("all"))

При открытии Страницы

Форма Tkinter отстает в отображении данных при прокрутке

При прокрутке

Форма Tkinter отстает в отображении данных при прокрутке

Какой смысл помещать tk.Checkbutton(label,... в tk.Label(...?

stovfl 08.04.2019 18:43

@stovfl Поскольку у меня есть несколько кнопок-флажков, я помещаю их все на метку, а затем помещаю метку на рамку.

Fardin Behboudi 09.04.2019 16:09

Не удалось воспроизвести вашу проблему, ваш минимальный воспроизводимый пример у меня не работает. Попробуйте, поменяйте на self.canvas.bind("<Configure>",...

stovfl 09.04.2019 17:48
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
3
357
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

из комментария @stovfl я понял, что у меня есть какие-то второстепенные лишние ярлыки.

Я просто опустил метку внутри функции populateCheckBox() и поместил флажки прямо в рамку на холсте.

изменить на: флажок = tk.Checkbutton (self.frame, рельеф = "плоский")

Другие вопросы по теме