Python / tkinter: горизонтальная полоса прокрутки не работает должным образом - PullRequest
1 голос
/ 06 мая 2020

У меня проблема с использованием горизонтального tk.Scrollbar в виджете tk.Text. Он отображается слишком маленьким для области, которую предполагается прокручивать - если я перемещаю ее влево, она достигает конца прокручиваемой области до того, как небольшая полоса коснется правой стороны, как и следовало ожидать. Кроме того, если я позволю ему go, он визуально вернется в исходное положение в начале, однако состояние прокрутки не изменится.

Что странно, так это то, что я использую точно такой же синтаксис для вертикального полоса прокрутки, и она работает безупречно.

Я включил, как я (ab), используя tk.Text -виджет, который tk.Label -виджет встроен в tk.Text -виджет с помощью метода window_create .

Скриншоты:

wrong size not scrolled all the way to the right

Код:

import tkinter as tk

class app(tk.Tk):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.frame = tk.Frame(self)
        self.frame.grid(row=0, column=0, sticky='NW')

        # widget definitions
        cellYScrollbar = tk.Scrollbar(self, orient="vertical")
        cellXScrollbar = tk.Scrollbar(self, orient="horizontal")
        full_width = 30
        self.cell = tk.Text(
            self, yscrollcommand=cellYScrollbar.set, xscrollcommand=cellXScrollbar.set,
            width=full_width, height=full_width / 2, wrap="none",
            cursor="arrow"
        )
        cellYScrollbar.config(command=self.cell.yview)
        cellXScrollbar.config(command=self.cell.xview)

        # widget gridding
        self.cell.grid(row=0, column=0, sticky='NW', padx=[5, 0], pady=[5, 0])
        cellXScrollbar.grid(row=1, column=0, columnspan=2, sticky='NEW', padx=[5, 0], pady=[0, 5])
        cellYScrollbar.grid(row=0, column=1, sticky='NSW', padx=[0, 5], pady=[5, 0])

        tiles = []
        for i in range(0, 9):
            for j in range(0, 9):
                test = tk.Label(self.cell, text='TEST'+str(i)+str(j), width=7, height=3)
                tiles.append(test)
                self.cell.window_create("end", window=test, padx=1, pady=1)
            self.cell.insert("end", "\n")

        for tile in tiles:
            tile.bind("<MouseWheel>", lambda event: self.cell.yview_scroll(int(-1 * (event.delta / 120)), "units"))
        self.cell.config(state='disabled')


root = app()
root.mainloop()

РЕДАКТИРОВАТЬ: исправлен код, .set отсутствовал в xscrollcommand=cellXScrollbar.set, спасибо acw1668!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...