Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Tkinter-动态字体大小更改_Python_Fonts_Tkinter_Python 3.5 - Fatal编程技术网

Python Tkinter-动态字体大小更改

Python Tkinter-动态字体大小更改,python,fonts,tkinter,python-3.5,Python,Fonts,Tkinter,Python 3.5,我几乎尝试了所有的方法,并且到处寻找如何在文本小部件中动态更改字体。我不希望文本小部件中的所有文本只更改字体大小更改后键入的文本,如页面或单词等 这就是我想象中的效果: #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.

我几乎尝试了所有的方法,并且到处寻找如何在文本小部件中动态更改字体。我不希望文本小部件中的所有文本只更改字体大小更改后键入的文本,如页面或单词等

这就是我想象中的效果:

#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)
但是,它所做的只是在光标后更改字母的大小,只有在有字母的情况下,再进一步键入时才会返回到原始字体大小。

编辑:

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

新版本:

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

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

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来设置标记。否则,最后输入的文本将没有标记

旧版本:

我在想,如果你想有动态变化,你必须检查文本小部件的变化。每次使用选项菜单更改字体大小时,都会创建一个新标记

在我下面的示例代码中,当文本小部件处于焦点时,它会检查KeyRelease。当前标记索引将在您键入时展开,当您选择新字体大小时,它将创建一个新标记。在我可以使用的地方使用了你的代码,只是调整了它,使其能够工作,而不必在类中

import sys
import tkinter as tk
from tkinter import ttk


def main():
    def text_changes(*event):
        # On every KeyRelease with the Text widget in focus,
        # it get the current tag, start index and current index.
        theFont = "Arial %d" % var.get()
        textentry.tag_add(current_tag.get(), start_index.get(), current_index())
        textentry.tag_config(current_tag.get(), font=theFont)

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

    def fontSizeFunc(*new_var):
        # Create a new tag with a new start index / position
        start_index.set(current_index())
        current_tag.set(current_index())

    # 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(current_index())

    # When the text entry has focus, every key release will run the
    # text_changes function
    textentry.bind('<KeyRelease>', text_changes)

    root.mainloop()

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

希望您可以使用它来构建自己更好的版本:

尝试将第二个插入更改为END,这样您就可以在配置的标记中键入内容。@TerryJanReedy我也尝试过,光标大小会更改,并保持在指定的字体大小,但键入的文本仍然是默认大小。然后,当我将光标移到文本的中间并改变字体大小时,从光标到文本末尾的文本被更改为指定的大小。