Tkinter如何更改treeview字体

Tkinter如何更改treeview字体,tkinter,Tkinter,我试图在tkinter树视图中更改字体,但不知道如何更改。我可以更改treeview列标题字体,但不能更改行中的字体。下面的演示使用spinbox更改字体大小。我尝试过使用“TkTextFont”,但它不起作用,它会更改spinbox中的字体大小,但不会更改树视图 import tkinter as tk import tkinter.ttk as ttk import tkinter.font as tkfont class MySpinbox(ttk.Spinbox): def

我试图在tkinter树视图中更改字体,但不知道如何更改。我可以更改treeview列标题字体,但不能更改行中的字体。下面的演示使用spinbox更改字体大小。我尝试过使用“TkTextFont”,但它不起作用,它会更改spinbox中的字体大小,但不会更改树视图

import tkinter as tk
import tkinter.ttk as ttk
import tkinter.font as tkfont


class MySpinbox(ttk.Spinbox):
    def __init__(self, master=None, delay=250, **kwargs):
        ttk.Spinbox.__init__(self, master, **kwargs)
        self.delay = delay  # repeatdelay in ms
        self.bind('<<Increment>>', self._on_increment)
        self.bind('<<Decrement>>', self._on_decrement)
        self._increment_lock = False
        self._decrement_lock = False

    def _unlock_increment(self):
        self._increment_lock = False

    def _on_increment(self, event):
        if self._increment_lock:
            return "break"  # stop the increment
        else:
            # generate a virtual event corresponding to when the spinbox
            # is actually incremented
            self.event_generate('<<ActualIncrement>>')
            self._increment_lock = True
            self.after(self.delay, self._unlock_increment)

    def _unlock_decrement(self):
        self._decrement_lock = False

    def _on_decrement(self, event):
        if self._decrement_lock:
            return "break"  # stop the increment
        else:
            # generate a virtual event corresponding to when the spinbox
            # is actually decremented
            self.event_generate('<<ActualDecrement>>')
            self._decrement_lock = True
            self.after(self.delay, self._unlock_decrement)


class App(tk.Tk):
    def __init__(self):
        super().__init__()
        self.rowconfigure(0, weight=1)
        self.columnconfigure(0, weight=1)
        self.title('Treeview Demo')
        self.geometry('420x200+20+20')

        style = ttk.Style()

        var = tk.StringVar()
        var.set(9)

        tv = self.tv = ttk.Treeview(self)
        tv.grid(row=0, column=0, sticky='NSEW')

        def size():
            font = tkfont.nametofont('TkHeadingFont')
            font.config(size=var.get())
            style.configure('Treeview.Heading', font=font)

            font = tkfont.nametofont('TkTextFont')
            font.config(size=var.get())

        spn = MySpinbox(self, textvariable=var, values=list(range(0, 1000)), command=size)
        spn.grid(row=0, column=1, pady=5, padx=20)

        tv.heading('#0', text='Name')

        tv.insert('', '0', 'item1', text='Item 1')
        tv.insert('', '1', 'item2', text='Item 2')
        tv.insert('', '2', 'item3', text='Item 3')

        tv.insert('item1', '0', 'python1', text='Python 1')
        tv.insert('item1', '1', 'python2', text='Python 2')

        tv.insert('python1', '0', 'sub1', text='Sub item 1')
        tv.insert('python1', '1', 'sub2', text='Sub item 2')


def main():
    app = App()
    app.mainloop()


if __name__ == '__main__':
    main()
将tkinter作为tk导入
将tkinter.ttk导入为ttk
将tkinter.font作为tkfont导入
类MySpinbox(ttk.Spinbox):
定义初始值(自,主=无,延迟=250,**kwargs):
ttk.Spinbox.\uuuuu init\uuuuuuuuuuuuuuuuuuuuuuuuuuuuu(自我、主控、**kwargs)
self.delay=延迟#重复延迟(毫秒)
self.bind(“”,self.\u在增量上)
自我约束('',自我递减)
self.\u increment\u lock=False
自衰减锁定=假
def解锁增量(自):
self.\u increment\u lock=False
def-on增量(自身、事件):
如果自锁.\u增量\u锁:
返回“break”#停止增量
其他:
#生成与spinbox启动时对应的虚拟事件
#实际上是递增的
自我事件_生成(“”)
self.\u increment\u lock=True
self.after(self.delay,self.\u解锁\u增量)
def_解锁_减量(自):
自衰减锁定=假
def_开_减量(自身、事件):
如果是自减锁定:
返回“break”#停止增量
其他:
#生成与spinbox启动时对应的虚拟事件
#实际上是递减的
自我事件_生成(“”)
自衰减锁定=真
self.after(self.delay,self.\u解锁\u减量)
类应用程序(tk.tk):
定义初始化(自):
super()。\uuuu init\uuuuu()
self.rowconfigure(0,权重=1)
self.columnconfigure(0,权重=1)
self.title('Treeview Demo')
自几何体('420x200+20+20')
style=ttk.style()
var=tk.StringVar()
变量集(9)
tv=self.tv=ttk.Treeview(self)
tv.grid(行=0,列=0,sticky='NSEW')
def size():
font=tkfont.nametofont('TkHeadingFont'))
font.config(size=var.get())
style.configure('Treeview.Heading',font=font)
font=tkfont.nametofont('TkTextFont'))
font.config(size=var.get())
spn=MySpinbox(self,textvariable=var,values=list(范围(0,1000)),command=size)
标准网格(行=0,列=1,pady=5,padx=20)
电视标题(“#0”,text='Name')
插入(“”,'0','item1',text='item1')
插入(“”,'1','item2',text='item2')
插入(“”,'2','item3',text='item3')
insert('item1','0','python1',text='python1')
insert('item1','1','python2',text='python2')
插入('python1','0','sub1',text='subitem1')
插入('python1','1','sub2',text='subitem 2')
def main():
app=app()
app.mainloop()
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
main()

我刚刚学会了如何在树视图中设置字体,我在这里发布了我的解决方案,以防其他人有同样的问题。treeview似乎不响应命名字体,您必须使用 tag_configure()并在树中插入项时设置tags参数。我认为这是唯一的办法

import tkinter as tk
import tkinter.ttk as ttk
import tkinter.font as tkfont


class MySpinbox(ttk.Spinbox):
    def __init__(self, master=None, delay=100, **kwargs):
        ttk.Spinbox.__init__(self, master, **kwargs)
        self.delay = delay  # repeatdelay in ms
        self.bind('<<Increment>>', self._on_increment)
        self.bind('<<Decrement>>', self._on_decrement)
        self._increment_lock = False
        self._decrement_lock = False

    def _unlock_increment(self):
        self._increment_lock = False

    def _on_increment(self, event):
        if self._increment_lock:
            return "break"  # stop the increment
        else:
            # generate a virtual event corresponding to when the spinbox
            # is actually incremented
            self.event_generate('<<ActualIncrement>>')
            self._increment_lock = True
            self.after(self.delay, self._unlock_increment)

    def _unlock_decrement(self):
        self._decrement_lock = False

    def _on_decrement(self, event):
        if self._decrement_lock:
            return "break"  # stop the increment
        else:
            # generate a virtual event corresponding to when the spinbox
            # is actually decremented
            self.event_generate('<<ActualDecrement>>')
            self._decrement_lock = True
            self.after(self.delay, self._unlock_decrement)


class App(tk.Tk):
    def __init__(self):
        super().__init__()
        self.rowconfigure(0, weight=1)
        self.columnconfigure(0, weight=1)
        self.title('Treeview Demo')
        self.geometry('420x200+20+20')

        style = ttk.Style()

        var = tk.StringVar()
        var.set(9)

        tv = self.tv = ttk.Treeview(self)
        tv.grid(row=0, column=0, sticky='NSEW')

        font = tkfont.nametofont('TkTextFont')
        tv.tag_configure('TkTextFont', font=tkfont.nametofont('TkTextFont'))
        style.configure('Treeview', rowheight=font.metrics('linespace'))

        def size():
            _font = tkfont.nametofont('TkHeadingFont')
            _font.config(size=var.get())
            style.configure('Treeview.Heading', font=_font)

            _font = tkfont.nametofont('TkTextFont')
            _font.configure(size=var.get())
            style.configure('Treeview', rowheight=_font.metrics('linespace'))

        spn = MySpinbox(self, textvariable=var, values=list(range(0, 1000)), command=size)
        spn.grid(row=0, column=1, pady=5, padx=20)

        tv.heading('#0', text='Name')

        tv.insert('', '0', 'item1', text='Item 1', tags='TkTextFont')
        tv.insert('', '1', 'item2', text='Item 2', tags='TkTextFont')
        tv.insert('', '2', 'item3', text='Item 3', tags='TkTextFont')

        tv.insert('item1', '0', 'python1', text='Python 1', tags='TkTextFont')
        tv.insert('item1', '1', 'python2', text='Python 2', tags='TkTextFont')

        tv.insert('python1', '0', 'sub1', text='Sub item 1', tags='TkTextFont')
        tv.insert('python1', '1', 'sub2', text='Sub item 2', tags='TkTextFont')


def main():
    app = App()
    app.mainloop()


if __name__ == '__main__':
    main()
将tkinter作为tk导入
将tkinter.ttk导入为ttk
将tkinter.font作为tkfont导入
类MySpinbox(ttk.Spinbox):
定义初始值(自,主=无,延迟=100,**kwargs):
ttk.Spinbox.\uuuuu init\uuuuuuuuuuuuuuuuuuuuuuuuuuuuu(自我、主控、**kwargs)
self.delay=延迟#重复延迟(毫秒)
self.bind(“”,self.\u在增量上)
自我约束('',自我递减)
self.\u increment\u lock=False
自衰减锁定=假
def解锁增量(自):
self.\u increment\u lock=False
def-on增量(自身、事件):
如果自锁.\u增量\u锁:
返回“break”#停止增量
其他:
#生成与spinbox启动时对应的虚拟事件
#实际上是递增的
自我事件_生成(“”)
self.\u increment\u lock=True
self.after(self.delay,self.\u解锁\u增量)
def_解锁_减量(自):
自衰减锁定=假
def_开_减量(自身、事件):
如果是自减锁定:
返回“break”#停止增量
其他:
#生成与spinbox启动时对应的虚拟事件
#实际上是递减的
自我事件_生成(“”)
自衰减锁定=真
self.after(self.delay,self.\u解锁\u减量)
类应用程序(tk.tk):
定义初始化(自):
super()。\uuuu init\uuuuu()
self.rowconfigure(0,权重=1)
self.columnconfigure(0,权重=1)
self.title('Treeview Demo')
自几何体('420x200+20+20')
style=ttk.style()
var=tk.StringVar()
变量集(9)
tv=self.tv=ttk.Treeview(self)
tv.grid(行=0,列=0,sticky='NSEW')
font=tkfont.nametofont('TkTextFont'))
tv.tag\u configure('TkTextFont',font=tkfont.nametofont('TkTextFont'))
style.configure('Treeview',rowheight=font.metrics('linespace'))
def size():
_font=tkfont.nametofont('TkHeadingFont'))
_font.config(size=var.get())
style.configure('Treeview.Heading',font=\u font)
_font=tkfont.nametofont('TkTextFont'))
_font.configure(size=var.get())
style.configure('Treeview',rowheight=\u font.metrics('linespace'))
spn=MySpinbox(self,textvariable=var,values=list(范围(0,1000)),command=size)
标准网格(行=0,列=1,pady=5,padx=20)
电视标题(“#0”,text='Name')
插入(“”,'0','item1',text='item1',tags='TkTextFont')
插入(“”,'1','item2',text='Item 2',tags='TkTextFont')
插入(“”,'2','item3',text='Item
tk.splitlist(tk.call("font", "names"))