Холст прокручивается вверх, когда не должно - PullRequest
1 голос
/ 16 марта 2020

У меня есть canvas

canvas = tk.Canvas(app, bd=0, highlightthickness=0, bg=style.background)
canvas.pack(side="left", fill="both", expand=True)

У меня есть полоса прокрутки в этом canvas

def onFrameConfigure(canvas):
    # Reset the scroll region to encompass the inner frame
    canvas.configure(scrollregion=canvas.bbox("all"))
scrollbar = tk.Scrollbar(app, orient="vertical", command=canvas.yview)
canvas.configure(yscrollcommand=scrollbar.set)
scrollbar.pack(side="right", fill="y")
main_frame.bind("<Configure>", lambda event, canvas=canvas: onFrameConfigure(canvas))

, и я настраиваю клавиши вверх и вниз для прокрутки вверх и вниз.

app.bind("<Down>", lambda event: canvas.yview_scroll(1, "units"))
app.bind("<Up>", lambda event: canvas.yview_scroll(-1, "units"))

Проблема в том, что когда полоса прокрутки в canvas отключена, я могу прокрутить вверх больше, чем я смогу прокрутить вверх (с помощью canvas.yview_scroll(-1, "units")).

Это должно быть так, и не позволяйте мне прокручивать вверх, если нет возможности что-то прокрутить тоже.
Должно быть так, даже если я сделаю canvas.yview_scroll(-1, "units"), оно все равно не должно прокручиваться вверх, как на первом изображении

Или вот так, когда полоса прокрутки активна, я не могу прокрутить вверх.
Если я сделаю canvas.yview_scroll(-1, "units"), ничего не произойдет, так как я уже на вершине. Я хочу, чтобы это происходило и в первом случае (когда полоса прокрутки не активна).


По сути, я хочу, чтобы canvas без активной полосы прокрутки (потому что прокручивать нечего to) виджеты на холсте остаются сверху (и не позволяют прокручивать с помощью canvas.yview_scroll(-1, "units")).
Заранее спасибо!

1 Ответ

1 голос
/ 17 марта 2020

Вопрос : прокрутка холста вверх, когда он не должен

Это происходит, когда scrolledregion= меньше, чем родительский, здесь app, the canvas.

Вы используете:

  • bbox(item=None)
    Возвращает ограничивающий прямоугольник в виде 4-х кортежей для всех соответствующие предметы.

Значение bbox может быть меньше, если нет элемент или все элементы подходят для родителей height.


Решение :

Перед применением scrolledregion= убедитесь, что bbox, здесь значение height, >=, чем height родительского элемента.

def onFrameConfigure(canvas):
    # Reset the scroll region to encompass the inner frame
    bbox = self.canvas.bbox("all")
    x, y, width, height = bbox
    if height < self.canvas.winfo_height():
        bbox = x, y, width, self.canvas.winfo_height()

    self.canvas.configure(scrollregion=bbox)

Соблюдайте примечание от

  • Tkinter.Canvas.bbox-method
    ограничивающая рамка является приблизительной и может отличаться несколько пикселей от реального значения
...