我需要一个遍历所有用户安装字体的Python3.3 Tkinter可滚动列表框的帮助。此功能的目的是在程序的另一部分中更改“文本字段”中的字体。

from tkinter import *
import tkinter.font

def fontValue():
    fontroot=Tk()
    fontroot.wm_title('FONTS')

    fonts=list(tkinter.font.families())
    fonts.sort()

    fontbox = Listbox(fontroot,height=20)
    fontbox.pack(fill=BOTH, expand=YES, side=LEFT)

    scroll = Scrollbar(fontroot)
    scroll.pack(side=RIGHT, fill=Y, expand=NO)

    scroll.configure(command=fontbox.yview)
    fontbox.configure(yscrollcommand=scroll.set)



    for item in fonts:
        fontbox.insert(END, item)

    fontroot.mainloop()


那么,如何将列表框中当前选择的字体字符串分配给变量?我想将当前选择的字体分配给一个变量....让我们称它为MainFontVar .....我没有在代码中放入变量,因为我不知道如何访问当前选择的字体...。任何帮助将不胜感激....我为我的迟钝而道歉。

最佳答案

您需要保存字体列表,因为小部件只能给您选定的索引。大致情况:

from tkinter import *
import tkinter.font

class Main(Tk):
    def __init__(self, *args, **kwargs):
        Tk.__init__(self, *args, **kwargs)

        self.fonts = list(tkinter.font.families())
        self.fonts.sort()

        self.list = Listbox(self)
        for item in self.fonts:
            self.list.insert(END, item)
        self.list.pack(side=LEFT, expand=YES, fill=BOTH)
        self.list.bind("<<ListboxSelect>>", self.PrintSelected)

        self.scroll = Scrollbar(self)
        self.scroll.pack(side=RIGHT, fill=Y)

        self.scroll.configure(command=self.list.yview)
        self.list.configure(yscrollcommand=self.scroll.set)

    def PrintSelected(self, e):
        print(self.fonts[int(self.list.curselection()[0])])

root = Main()
root.mainloop()


很棒的Tk教程位于http://www.tkdocs.com/

为了获得更好的外观(在我的情况下,在Windows上),可以将ttk用作Scrollbar,并禁用Listbox中已激活元素的下划线(没有主题变体)。

from tkinter import ttk
from tkinter import *
import tkinter.font

class Main(Tk):
    def __init__(self, *args, **kwargs):
        Tk.__init__(self, *args, **kwargs)

        self.fonts = list(tkinter.font.families())
        self.fonts.sort()

        self.list = Listbox(self, activestyle=NONE)
        for item in self.fonts:
            self.list.insert(END, item)
        self.list.pack(side=LEFT, expand=YES, fill=BOTH)
        self.list.bind("<<ListboxSelect>>", self.PrintSelected)

        self.scroll = ttk.Scrollbar(self)
        self.scroll.pack(side=RIGHT, fill=Y)

        self.scroll.configure(command=self.list.yview)
        self.list.configure(yscrollcommand=self.scroll.set)

    def PrintSelected(self, e):
        print(self.fonts[int(self.list.curselection()[0])])

root = Main()
root.mainloop()

07-26 09:30