Tkinter动态字体大小更改

2024-06-26 15:31:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我几乎什么都试过了,到处寻找如何在Text()小部件中动态更改字体。我不想让Text()小部件中的所有文本只更改字体大小更改后键入的文本,如页面或单词等

这就是我想象中的效果:

#in the __init__ function
    sizesList = [8, 10, 12, 13, 14, 16, 18, 22, 26, 32, 40]
    var = IntVar()
    var.set(13)
    self.fontsizeDropDown = OptionMenu(self.toolbarFrame, var, *sizesList, command=self.fontSizeFunc)
    self.fontsizeDropDown.grid(row=0, column=1, sticky=N)

def fontSizeFunc(self, var):
    theFont = "Arial %d" % var
    self.textentry.tag_add('texthere', INSERT, INSERT)
    self.textentry.tag_config('texthere', font=theFont)

不过,它所做的只是改变光标后字母的大小,只有在那里有一个字母时,然后任何进一步的输入都会回到原来的字体大小。在


Tags: text文本self部件vartag字母字体大小
1条回答
网友
1楼 · 发布于 2024-06-26 15:31:22

编辑:

想出了另一种方法,我更喜欢,所以把这个放在上面,下面的旧的作为参考。在

新版本:

代码需要跟踪标记索引的开始和结束位置。它还将为每个字体大小提供一个唯一的标记名。我认为一个好的标记名可以与用于标记配置的字体和大小相同。在

当选择一个新的字体大小时,写入的文本将得到一个带有起始和结束索引的标记,并配置了适当的字体大小。然后它将设置新的字体大小,将其设置为文本小部件并更新变量。除非再次更改字体大小,否则不会添加标记。但是由于文本小部件具有当前选择的字体大小,因此它将以正确的大小显示。在

import sys
import tkinter as tk
from tkinter import ttk


def main():
    def current_index():
        # Return current cursor position in the text widget
        return textentry.index(tk.INSERT)

    def fontSizeFunc(*new_var):
        # Set the tag for the text that has been written
        textentry.tag_add(current_tag.get(), start_index.get(), current_index())
        textentry.tag_config(current_tag.get(), font=current_tag.get())

        # Sets new Font Size, store start_index position for new tag,
        # create a new tag that has theFont as tag name
        theFont = "Arial %d" % new_var
        textentry.configure(font=theFont)
        start_index.set(current_index())
        current_tag.set(theFont)

    # Simple Tkinter setup for testing purpose
    root = tk.Tk()

    sizesList = [8, 10, 12, 13, 14, 16, 18, 22, 26, 32, 40]
    var = tk.IntVar()
    var.set(13)

    frame = ttk.Frame(root)
    frame.grid(column=0, row=0)
    fontsizeDropDown = tk.OptionMenu(frame, var, *sizesList, command=fontSizeFunc)
    fontsizeDropDown.grid(row=0, column=1, sticky=tk.N)
    textentry = tk.Text(frame)
    textentry.grid(row=1, column=0, columnspan=2)

    # Initialize start_index and current_tag
    start_index = tk.StringVar()
    current_tag = tk.StringVar()
    start_index.set(current_index())
    current_tag.set("Arial %d" % var.get())

    root.mainloop()

if __name__ == '__main__':
    sys.exit(main())

如果要在文本小部件中存储文本,请记住在退出/存储之前通过调用fontSizeFunc()来设置标记。否则最后输入的文本将没有标记。在

旧版本:

如果你想改变的话,我会改变你的想法。每次使用选项菜单更改字体大小时,都会创建一个新标记。在

在下面我的示例代码中,当文本小部件处于焦点时,它检查keyrease。当您键入时,当前标记索引将展开,当您选择新的字体大小时,它将创建一个新的标记。在我能用的地方用你的代码,只是在不上课的情况下调整它。在

^{pr2}$

希望你能用这个来建立你自己更好的版本:)

相关问题 更多 >