tkinter изменяет размер окна без исчезновения полосы прокрутки

Я кодировал приложение, которое в значительной степени представляет собой причудливый текстовый редактор, и у меня возникли проблемы с изменением размера виджетов внутри него. Моя цель — сделать его немного похожим на IDLE с горизонтальной полосой прокрутки.

from tkinter import *
from tkinter import ttk

root = Tk()

width = preset frame width in relation to root
hieght = preset frame height in relation to root

frame = ttk.Frame(master=root, width=width, height=height)
frame.grid()
frame.grid_propagate(False)

vbar = ttk.Scrollbar(root, orient=VERTICAL)
hbar = ttk.Scrollbar(root, orient=HORIZONTAL)
vbar.grid(row=0, column=1, sticky=N S)
hbar.grid(row=1, column=0, sticky=E W)

text_widget = Text(frame, width=189, height=47, wrap=NONE, undo=True, yscrollcommand=vbar.set, xscrollcommand=hbar.set)
text_widget.grid()

vbar.config(command=text_widget.yview)
hbar.config(command=text_widget.xview)

Я использую Python 3.7, Windows 10 и PyCharm. Если вы найдете дубликат этого вопроса, прокомментируйте его и позвольте мне проверить его, прежде чем пометить его как дубликат и/или закрыть, поскольку я еще не нашел ответа. это работает, просто изменение размера является проблемой. он должен вести себя как блокнот Windows с отключенным переносом слов. Редактор в режиме разделенного экрана

введите здесь описание изображения


person Legorooj    schedule 16.11.2018    source источник
comment
Ваш код не может быть запущен. Существует множество ошибок, начиная с того, что ttk не импортируется, не определяется корень, не определяется ширина и т. д. Прочтите эту статью и отредактируйте .   -  person Ethan Field    schedule 16.11.2018


Ответы (1)


Это относительно простая проблема для решения.

Если вы хотите продолжить создание программы с помощью менеджера геометрии Grid, вам необходимо ознакомиться с функциями Grid.rowconfigure() и Grid.columnconfigure().

Они позволяют вам установить параметры конфигурации для Grid менеджера геометрии в пределах виджета-контейнера. В частности, нас интересует атрибут weight. Как описано здесь:

С каждым столбцом и строкой связан параметр сетки "вес", который указывает, насколько он должен увеличиться, если в мастере есть дополнительное место для заполнения. По умолчанию вес каждого столбца или строки равен 0, что означает, что они не расширяются, чтобы заполнить пространство.

Чтобы размер пользовательского интерфейса изменился, нам нужно придать положительный вес столбцам, которые мы хотим расширить. Это делается с помощью методов сетки «columnconfigure» и «rowconfigure». Если два столбца имеют одинаковый вес, они будут расширяться с одинаковой скоростью; если один имеет вес 1, другой - 3, последний будет расширяться на три пикселя за каждый пиксель, добавленный к первому.

(выделено мной)

Итак, в этом случае нам нужно внести несколько изменений. Во-первых, нам нужно добавить sticky = "NESW" к вызовам frame.grid() и text_widget.grid(), иначе виджет Text не будет расширяться с помощью полос прокрутки. Во-вторых, нам нужно добавить в программу приведенный ниже фрагмент:

Grid.columnconfigure(root, 0, weight=1)
Grid.rowconfigure(root, 0, weight=1)

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

Это заканчивается приведенной ниже программой (после внесения некоторых изменений, чтобы я мог фактически запустить предоставленный пример):

from tkinter import *
from tkinter import ttk

root = Tk()

frame = ttk.Frame(master=root)
frame.grid(sticky="NSEW")

vbar = ttk.Scrollbar(root, orient=VERTICAL)
hbar = ttk.Scrollbar(root, orient=HORIZONTAL)
vbar.grid(row=0, column=1, sticky="NS")
hbar.grid(row=1, column=0, sticky="EW")

text_widget = Text(frame, wrap=NONE, undo=True, yscrollcommand=vbar.set, xscrollcommand=hbar.set)
text_widget.grid(sticky="NSEW")

vbar.config(command=text_widget.yview)
hbar.config(command=text_widget.xview)

Grid.columnconfigure(root, 0, weight=1)
Grid.rowconfigure(root, 0, weight=1)

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

В качестве примечания: было бы очень просто перестроить эту программу с помощью менеджера геометрии Pack, который является (субъективно) более разумным, когда дело доходит до изменения размеров виджетов:

from tkinter import *
from tkinter import ttk

root = Tk()

frame = ttk.Frame(master=root)
frame.pack(expand=True, fill="both")

vbar = ttk.Scrollbar(frame, orient=VERTICAL)
hbar = ttk.Scrollbar(root, orient=HORIZONTAL)
vbar.pack(side="right", fill="y")
root.update()
hbar.pack(side="bottom", fill="x", padx=vbar.winfo_width())

text_widget = Text(frame, wrap=NONE, undo=True, yscrollcommand=vbar.set, xscrollcommand=hbar.set)
text_widget.pack(expand=True, fill="both")

vbar.config(command=text_widget.yview)
hbar.config(command=text_widget.xview)
person Ethan Field    schedule 16.11.2018
comment
grid определенно лучше, если есть как горизонтальная, так и вертикальная полоса прокрутки. При использовании pack либо правый край горизонтальной полосы прокрутки находится под вертикальной полосой прокрутки, либо нижний край вертикальной полосы прокрутки находится справа от горизонтальной полосы прокрутки. Любой из них выглядит немного неряшливо. - person Bryan Oakley; 16.11.2018
comment
@BryanOakley Это правда. Я сделал изменение, которое объясняет это. Предполагая, что вертикальная полоса никогда не меняет толщину, вы можете добавить padx к горизонтальной полосе со значением VERTICAL_WIDGET.winfo_width(). Не идеально, так как он накрывает обе стороны, но это лучшее, что вы можете получить. - person Ethan Field; 16.11.2018
comment
Спасибо, я попробую! И я мог бы использовать как пакет, так и сетку, потому что фрейм - это другая область, в которой не используется геоменеджер, то есть использовать сетку для внешнего фрейма и пакет внутри - person Legorooj; 18.11.2018
comment
@EthanField Спасибо за помощь! Он сделал именно то, что мне было нужно! - person Legorooj; 24.11.2018