Как остановить изменение размера виджета Tkinter Text при смене шрифта? - PullRequest
6 голосов
/ 23 марта 2012

Я пытаюсь создать простой текстовый процессор для начинающих, чтобы немного лучше изучить Python.

Я использую виджет Tkinter Text для основной программы редактирования, единственная проблема - высота и ширина определяются символами.

Это создает проблему, когда я меняю шрифты, поскольку не все шрифты имеют одинаковую ширину.

Каждый раз, когда шрифт изменяется, виджет Текст изменяет размеры, хотя технически он одинаков.ширина и высота.Это выглядит нелепо, когда я пытаюсь что-то напечатать, я пытаюсь сделать текстовый процессор максимально возможным nice .

Есть ли способ определить ширину и высоту в пикселях?

.grid_propagate(False) бесполезен, так как размер технически не меняется, только ширина символа.

Я сейчас пытаюсь держаться подальше от wxPython, так как все, что у меня естьсделано до этого момента было в Tkinter.

Я провел бесконечные часы интенсивного поиска в Google, но не нашел решений.

Ответы [ 2 ]

10 голосов
/ 23 марта 2012

Вы ошибаетесь, когда говорите, что не можете использовать grid_propagate(False), потому что можете. grid_propagate относится к фактическому размеру , а не к атрибуту . Кроме того, если вы просто зададите приложению фиксированный размер, используя wm_geometry, изменения шрифта не повлияют на размер окна.

Вот пример использования grid_propagate, который устанавливает контейнер на фиксированный размер в пикселях:

import Tkinter as tk
import tkFont

class SampleApp(tk.Tk):
    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)
        self._textFont = tkFont.Font(name="TextFont")
        self._textFont.configure(**tkFont.nametofont("TkDefaultFont").configure())

        toolbar = tk.Frame(self, borderwidth=0)
        container = tk.Frame(self, borderwidth=1, relief="sunken", 
                             width=600, height=600)
        container.grid_propagate(False)
        toolbar.pack(side="top", fill="x")
        container.pack(side="bottom", fill="both", expand=True)

        container.grid_rowconfigure(0, weight=1)
        container.grid_columnconfigure(0, weight=1)
        text = tk.Text(container, font="TextFont")
        text.grid(row=0, column=0, sticky="nsew")

        zoomin = tk.Button(toolbar, text="+", command=self.zoom_in)
        zoomout = tk.Button(toolbar, text="-", command=self.zoom_out)
        zoomin.pack(side="left")
        zoomout.pack(side="left")

        text.insert("end", '''Press te + and - buttons to increase or decrease the font size''')

    def zoom_in(self):
        font = tkFont.nametofont("TextFont")
        size = font.actual()["size"]+2
        font.configure(size=size)

    def zoom_out(self):
        font = tkFont.nametofont("TextFont")
        size = font.actual()["size"]-2
        font.configure(size=max(size, 8))

if __name__ == "__main__":
    app = SampleApp()
    app.mainloop()
0 голосов
/ 12 июня 2019

.. протестировал это: это работает с размером фрейма, но не с размером (прокручиваемого) текстового виджета.Моя установка немного сложнее, с мастер-кадром для 2 сайтов, мэйнфреймами для каждого сайта и кадрами с различным содержимым, в том числе с виджетом прокрутки текста.

добавление grid_propagate, * _row- и * _columnconfigure защитили мастер-рамку от изменения размерадаже при добавлении опций сетки в основной и контентный фреймы, что приводит к тому, что мэйнфрейм может изменить размер. При изменении шрифта изменяется и размер виджетов - и, в последнем примере, виджет scrolledtext-виджет исчезает за рамкой справасторона (содержащая другие виджеты) ..

...