Полосы прокрутки Tkinter не заполняются или выравниваются неправильно - PullRequest
1 голос
/ 08 января 2020

Я пытаюсь создать рамку с вертикальной и горизонтальной полосой прокрутки, но горизонтальная, кажется, упаковывается рядом с холстом, а не под ним. У меня есть полоса прокрутки, заполненная side=tk.BOTTOM и fill=tk.X, поэтому я не уверен, что еще мне нужно добавить. Что я должен сделать, чтобы горизонтальная полоса прокрутки растянулась по всему холсту?

import tkinter as tk
from tkinter import ttk

root=tk.Tk()

frame=tk.Frame(root)
frame.pack()

canvas=tk.Canvas(frame, height=200, width=200, background="blue")
canvas.pack(side=tk.LEFT)

yscrollbar=tk.Scrollbar(frame, orient=tk.VERTICAL, command=canvas.yview)
yscrollbar.pack(side=tk.RIGHT, fill=tk.Y)

xscrollbar=tk.Scrollbar(frame, orient=tk.HORIZONTAL, command=canvas.xview)
xscrollbar.pack(side=tk.BOTTOM, fill=tk.X)

canvas.configure(yscrollcommand=yscrollbar.set)
canvas.configure(xscrollcommand=xscrollbar.set)

root.mainloop()

enter image description here

Сейчас canvas установлено на side=tk.LEFT. Если установить значение side=tk.TOP, возникнет обратная проблема.

enter image description here

Ответы [ 2 ]

2 голосов
/ 08 января 2020

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

import tkinter as tk
from tkinter import ttk

root=tk.Tk()

frame=tk.Frame(root)
frame.pack()

canvas=tk.Canvas(frame, height=200, width=200, background="blue")

yscrollbar=tk.Scrollbar(frame, orient=tk.VERTICAL, command=canvas.yview)


xscrollbar=tk.Scrollbar(frame, orient=tk.HORIZONTAL, command=canvas.xview)

xscrollbar.pack(side=tk.BOTTOM, fill=tk.X)
yscrollbar.pack(side=tk.RIGHT, fill=tk.Y)
canvas.pack(side=tk.LEFT)

canvas.configure(yscrollcommand=yscrollbar.set)
canvas.configure(xscrollcommand=xscrollbar.set)

root.mainloop()

scrennshot

Однако, поскольку pack не так интуитивно понятен, когда речь идет о более сложных GUI, я предпочитаю использовать grid:

xscrollbar.grid(row=1, column=0, sticky='ew')
yscrollbar.grid(row=0, column=1, sticky='ns')
canvas.grid(row=0, column=0, sticky='ewns')

Но в этом случае, если вы хотите GUI для правильного изменения размера вам нужно будет добавить

frame.columnconfigure(0, weight=1)
frame.rowconfigure(0, weight=1)

, чтобы строка и столбец 0 сетки заполняли все доступное пространство.

0 голосов
/ 08 января 2020

В моем env вызовы canvas.pack и frame.pack после определения y и xscrollbar работали нормально.

import tkinter as tk
from tkinter import ttk

root=tk.Tk()

frame=tk.Frame(root)

yscrollbar=tk.Scrollbar(frame, orient=tk.VERTICAL, command=canvas.yview)
yscrollbar.pack(side=tk.RIGHT, fill=tk.Y)

xscrollbar=tk.Scrollbar(frame, orient=tk.HORIZONTAL, command=canvas.xview)
xscrollbar.pack(side=tk.BOTTOM, fill=tk.X)

canvas=tk.Canvas(frame, height=200, width=200, background="blue")
canvas.pack(side=tk.LEFT)

frame.pack()

canvas.configure(yscrollcommand=yscrollbar.set)
canvas.configure(xscrollcommand=xscrollbar.set)

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