鱼C论坛

 找回密码
 立即注册
查看: 1336|回复: 0

[作品展示] 用 tkinter 写的字体选择器

[复制链接]
发表于 2019-11-13 00:14:46 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 zltzlt 于 2019-11-16 21:44 编辑
  1. from tkinter import Tk, Frame, LabelFrame, OptionMenu, Checkbutton, Scale, Label, Button, StringVar, IntVar, BooleanVar, font
  2. from tkinter import ttk

  3. class Font_Selector:
  4.     def __init__(self):        
  5.         self.root = Tk()        
  6.         self.root.title('Font Selector')
  7.         self.root.geometry('600x400')

  8.         self.font_var = {'family': StringVar(), 'size' : IntVar(), 'weight' : StringVar(), 'slant' : StringVar(), 'underline' : BooleanVar(), 'overstrike' : BooleanVar()}
  9.         self.initial_font_var()

  10.         self.legend = StringVar()
  11.         self.legend_font = font.Font()
  12.         self.build_legend_font()

  13.     def initial_font_var(self, default=None):
  14.         if not default:
  15.             default = font.nametofont("TkDefaultFont")

  16.         self.font_var['family'].set(default.cget('family'))
  17.         self.font_var['size'].set(default.cget('size'))
  18.         self.font_var['weight'].set(default.cget('weight'))
  19.         self.font_var['slant'].set(default.cget('slant'))
  20.         self.font_var['underline'].set(default.cget('underline'))
  21.         self.font_var['overstrike'].set(default.cget('overstrike'))

  22.     def build_legend_font(self):
  23.         self.legend_font.config(family=self.font_var['family'].get())
  24.         self.legend_font.config(size=self.font_var['size'].get())
  25.         self.legend_font.config(weight=self.font_var['weight'].get())
  26.         self.legend_font.config(slant=self.font_var['slant'].get())
  27.         self.legend_font.config(underline=self.font_var['underline'].get())
  28.         self.legend_font.config(overstrike=self.font_var['overstrike'].get())

  29.     def build_setup(self):
  30.         frame_setup = Frame(self.root, padx=5, pady=5)
  31.         frame_setup.pack(fill='x')
  32.         frame_setup.columnconfigure(1, weight=1)
  33.         frame_setup.rowconfigure(1, weight=1)      

  34.         frame_family = LabelFrame(frame_setup, text='families')
  35.         frame_family.grid(row=0, column=0, padx=5, pady=5)

  36.         font_families = font.families()
  37.                
  38.         self.families = ttk.Combobox(frame_family, name='family', state="readonly", textvariable=self.font_var['family'], values=font_families)
  39.         self.families.grid(padx=10, pady=10, sticky='ew')

  40.         frame_style = LabelFrame(frame_setup, text='style')
  41.         frame_style.grid(row=0, column=1, sticky='ew', padx= 5)
  42.         frame_style.columnconfigure(0, weight=1)
  43.         frame_style.columnconfigure(1, weight=1)
  44.         frame_style.columnconfigure(2, weight=1)
  45.         frame_style.columnconfigure(3, weight=1)

  46.         self.weight = Checkbutton(frame_style, name='weight', text='Bold', variable=self.font_var['weight'], onvalue='bold', offvalue='normal', command=lambda event='weight' : self.font_changed(event))
  47.         self.weight.grid(row=0, column=0, padx=10, pady=8, sticky='ew')
  48.         self.slant = Checkbutton(frame_style, name='slant', text='Italic', variable=self.font_var['slant'], onvalue='italic', offvalue='roman', command=lambda event='slant' : self.font_changed(event))
  49.         self.slant.grid(row=0, column=1, padx=10, pady=8, sticky='ew')
  50.         self.underline = Checkbutton(frame_style, name='underline', text='Underline', variable=self.font_var['underline'], command=lambda event='underline' : self.font_changed(event))
  51.         self.underline.grid(row=0, column=2, padx=10, pady=8, sticky='ew')
  52.         self.overstrike = Checkbutton(frame_style, name='overstrike', text='Overstrike', variable=self.font_var['overstrike'], command=lambda event='overstrike' : self.font_changed(event))
  53.         self.overstrike.grid(row=0, column=3, padx=10, pady=8, sticky='ew')

  54.         frame_size = LabelFrame(frame_setup, text='size')
  55.         frame_size.grid(row=1, column=0, columnspan=2, sticky='ew', padx=5)
  56.         frame_size.columnconfigure(0, weight=1)
  57.         
  58.         self.size = Scale(frame_size, variable = self.font_var['size'], from_=8, to=72, tickinterval=8, length=400, orient='horizontal', command=self.font_changed)
  59.         self.size.grid(row=1, column=0, sticky='ew', padx= 5, pady=5)

  60.     def build_legend(self):
  61.         frame_legend = LabelFrame(self.root, text='legend', bg='red', padx=5, pady=5)
  62.         frame_legend.pack(padx=10, fill='both', expand=True)

  63.         frame_legend.rowconfigure(0, weight=1)
  64.         frame_legend.columnconfigure(0, weight=1)

  65.         self.legend.set('ABCDEabcde12345')
  66.         self.legend = Label(frame_legend, textvariable=self.legend, font=self.legend_font, borderwidth=2, relief='groove', padx=10, pady=10)
  67.         self.legend.grid(row=0, column=0, padx=5, pady=5, sticky='ewns')

  68.     def font_changed(self, event):
  69.         # key = str(event.widget).split(".")[-1]
  70.         # value = event.widget.get()
  71.         # self.font_var[key].set(value)
  72.         self.build_legend_font()

  73.            

  74.     def build_event(self):
  75.         self.families.bind('<<ComboboxSelected>>', self.font_changed)

  76.     def build_footer(self):
  77.         separator = Frame(self.root, height=2, bd=2, relief='groove')
  78.         separator.pack(fill='x', padx=10, pady=2)
  79.         frame_footer = Frame(self.root, padx=5, pady=5)
  80.         frame_footer.pack(padx=10, fill='x')
  81.         self.apply = Button(frame_footer, text='apply', width=10)
  82.         self.apply.pack(side='right')        
  83.         self.cancel = Button(frame_footer, text='cancel', width=10)
  84.         self.cancel.pack(side='right', padx=10)
  85.         self.ok = Button(frame_footer, text='ok', width=10)
  86.         self.ok.pack(side='right')        
  87.         
  88.     def get_info(self):
  89.         defaut = font.nametofont("TkDefaultFont")
  90.         print('family: ', defaut.cget('family'))
  91.         print('size: ', defaut.cget('size'))   
  92.         print('weight: ', defaut.cget('weight'))   
  93.         print('slant: ', defaut.cget('slant'))   
  94.         print('underline: ', defaut.cget('underline'))
  95.         print('overstrike: ', defaut.cget('overstrike'))      

  96. if __name__ == '__main__':
  97.    
  98.     fs = Font_Selector()
  99.     fs.get_info()
  100.     fs.build_setup()
  101.     fs.build_legend()
  102.     fs.build_event()
  103.     fs.build_footer()
  104.     fs.root.mainloop()
复制代码

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-4 06:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表