Окно изменения размера tkinter без исчезновения полосы прокрутки - PullRequest
0 голосов
/ 16 ноября 2018

Я кодировал приложение, которое в значительной степени представляет собой необычный текстовый редактор, и у меня возникали проблемы с изменением размера виджетов внутри него.Моя цель - чтобы он выглядел как 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 с переносом слов.Editor in split-screen

enter image description here

1 Ответ

0 голосов
/ 16 ноября 2018

Это относительно простая задача, которую нужно решить.

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

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

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

Чтобы пользовательский интерфейс затем изменил размер, нам нужно дать положительный вес столбцам, которые мы хотели бы расширить. Это делается с использованием методов grid «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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...