如何防止Tkinter的文本小部件在字体更改时调整大小?

6

我想创建一个简单的文字处理器,以便更好地学习Python。

我使用Tkinter的Text小部件作为主要编辑程序,唯一的问题是高度宽度是由字符定义的。

这在更改字体时会产生问题,因为并非所有字体的宽度都相同。

每次更改字体时,Text小部件会重新调整大小,尽管从技术上讲它的宽度和高度是相同的。当试图输入内容时,这看起来很荒谬,我正在尝试使文字处理器尽可能美观

有没有办法以像素为单位定义宽度和高度?

.grid_propagate(False)对于大小不是真正变化的情况并不有用,只是字符宽度变化了。

我现在正在避免使用wxPython,因为到目前为止,我所做的一切都是在Tkinter中完成的。

我已经花费了大量时间进行广泛的谷歌搜索,但没有找到解决方案。

3个回答

12

当你说无法使用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()

@reallycoolnerd:很抱歉,但你关于grid_propagate的说法是错误的。它与大小属性无关,而与小部件的实际大小有关。如果您可以展示使用grid_propagate并且它不起作用的代码,我们可以修复它。听起来你不理解grid_propagate的工作原理。你知道你必须在父级上调用它吗?在文本小部件本身上调用grid_propagate没有任何效果。 - Bryan Oakley
我明天会尝试上传我的代码,但是我的电脑有点倔强,而且我也很累。对于这个延迟,我感到非常抱歉。 - reallycoolnerd
1
@reallycoolnerd:仅仅因为文本小部件填充了框架并不意味着您不能使用其他小部件。将框架和文本小部件视为单个小部件。您可以将该组合放入另一个框架中,以便添加其他小部件。我的示例说明了这一点--除了文本/框架组合外,还有按钮和工具栏。 - Bryan Oakley
嗯,我想我明白你的意思了。所以我应该能够在中间的帧的两侧添加帧并使用按钮。 我一有时间就会尝试一下。另外,我看到你使用了.pack方法和.grid方法。只要在同一个父级内使用一种类型,你可以同时使用两种方法吗?比如在使用pack的框架中放置一个文本框,在使用grid的不同框架中放置一个按钮?其他时候我在同一个父框架中同时使用两种方法时,它拒绝加载。 感谢您耐心回答我的问题。 - reallycoolnerd
1
@reallycoolnerd:如果你喜欢这个答案,请投赞成票。如果它解决了你的问题,请点击答案旁边的复选标记接受它。这样做可以让其他人知道他们不需要尝试给你不同的答案。更多信息请参见http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work - Bryan Oakley
显示剩余6条评论

0

已测试:此方法适用于框架大小,但不适用于(滚动)文本小部件的大小。 我的设置有点复杂,有一个包含两个站点的主框架、每个站点的主框架以及带有各种内容的框架,其中包括一个滚动文本小部件。

添加grid_propagate, *_row- 和 *_columnconfigure 可以防止主框架调整大小,即使在将网格选项添加到主框架和内容框架时也是如此,这将导致主框架调整大小。当更改字体时,小部件的大小也会改变 - 在最后一个示例中,滚动文本小部件消失在其右侧的框架之后(其中包含其他小部件)。


解决方法当然是调整高度(/行数)和宽度(/每行字母数),直到一切都适合。(抱歉:我忘了提到这一点。) - user11597978

0
使用pack geometry manager来打包小部件。
我正在创建一个记事本,并希望字体样本区显示字体大小。 因此,我创建了一个标签框架并在其中添加了一个标签 - 即AabYyZz - 以显示字体样本。
当我增加字体大小时,标签框架的大小也会增加,所以我尝试了.pack_propagate方法,它起作用了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接