Окно изменения размера 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 с переносом слов.
1 ответ
Это относительно простая проблема для решения.
Если вы хотите продолжить создание программы, используя Grid
менеджер геометрии, вам нужно будет ознакомиться с Grid.rowconfigure()
а также Grid.columnconfigure()
функции.
Это позволяет вам установить параметры конфигурации для Grid
Менеджер геометрии в пределах виджета контейнера. В частности, атрибут, который нас интересует, 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)