@and124578963

Tkinter: Артефакты при скроллинге объектов в canvas.create_window?

Здравствуйте! Сталкнулся с такой проблемой: при прокрутке скроллбаром или колесиком мыши canvas.create_window в котором находятся Frame , Label и Button появляются артефакты как на скриншотах ниже где-то на секунду. В основном заметно при горизонтальной прокрутке скроллбаром.
Это проблема чисто Tkinter и попробовать перейти на PyQt? Или я что-то сделал не так?
Горизонтальная прокрутка:
61d82b65378dd630687439.png
Вертикальная прокрутка:
61d82b79ae5de959156672.png

Кусок создания Canvas
self.right_frame = tk.Frame(self)
        self.right_frame_yscroll = tk.Frame(self)
        self.scroll_x = tk.Scrollbar(self.right_frame, orient=tk.HORIZONTAL)
        self.scroll_y = tk.Scrollbar(self.right_frame_yscroll, orient=tk.VERTICAL)
        self.canvas = tk.Canvas(self.right_frame,
                                xscrollcommand=self.scroll_x.set,
                                yscrollcommand=self.scroll_y.set, highlightthickness=0, bg="#E8E8E8")
        self.scroll_x.config(command=self.canvas.xview)
        self.scroll_y.config(command=self.canvas.yview)

        self.grid_of_data = tk.Frame(self.canvas, bg='#E8E8E8')


        self.canvas.create_window((0, 0), window=self.grid_of_data,
                                  anchor=tk.N + tk.W)

        self.scroll_x.pack(side=tk.BOTTOM, fill=tk.X, anchor=tk.S)
        self.scroll_y.pack(side=tk.LEFT, fill=tk.Y)
        self.canvas.pack(side=tk.BOTTOM, expand=1, fill=tk.BOTH)
        self.bind("<Configure>", self.resize)

self.canvas.bind("<Enter>", self.on_binds)  #вертикальная прокрутнка колесиком мыши при нахождении в области canvas
self.canvas.bind("<Leave>", self.off_binds)


Функция resize:
def resize(self, event=None):
        region = self.canvas.bbox(tk.ALL)
        self.canvas.configure(scrollregion=region)


def on_binds(self, event):
        self.idbind = self.bind_all("<MouseWheel>", self._on_mousewheel)

    def off_binds(self, event=None):
        self.unbind_all("<MouseWheel>")

    def _on_mousewheel(self, event):
        self.canvas.yview_scroll(int(-1 * (event.delta / 120)), "units")
  • Вопрос задан
  • 162 просмотра
Пригласить эксперта
Ответы на вопрос 1
@and124578963 Автор вопроса
Пока писал вопрос, придумал некоторое решение)
Добавил то же самое, только для Х скролл бара при вхождении мышкой в область Х скролл бара:
Но при перетаскивании вручную проблема осталась(
self.scroll_x.bind("<Enter>", self.on_binds_x)
        self.scroll_x.bind("<Leave>", self.off_binds)

    def on_binds_x(self, event):
        self.idbind = self.bind_all("<MouseWheel>", self._on_mousewheel_x)

        if event == 'Destroy':
            self.unbind_all("<Button-1>")
            self.root.destroy()

    def _on_mousewheel_x(self, event):

        self.canvas.xview_scroll(int(-1 * (event.delta / 120)), "units")
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы