#!/usr/bin/python # -*- coding: utf-8 -*- """ Status: 2017-04-26a python 2.7(.13) ok 3.5(.3) ok 3.6.(.0/.1) ERROR """ try: # py3 import tkinter as tk import tkinter.ttk as ttk import tkinter.font as tk_font except ImportError as err: # py2 import Tkinter as tk import ttk as ttk import tkFont as tk_font class Font_Dialog(tk.Toplevel): def __init__(self, parent, text, dialog_open_status): self.parent = parent self.text = text self.dialog_open_status = dialog_open_status def combine_style(font): if font['weight'] == 'normal': if font['slant'] == 'roman': combine = 'Standard' else: combine = 'Kursiv' else: if font['slant'] == 'roman': combine = 'Fett' else: combine = 'Fett Kursiv' return combine def splitt_style(part): style = self.style.get() if part == 'weight': if style == 'Standard' or style == 'Kursiv': splitt = 'normal' else: splitt = 'bold' else: if style == 'Kursiv' or style == 'Fett Kursiv': splitt = 'italic' else: splitt = 'roman' return splitt font = tk_font.Font(font=self.text['font']) self.font = tk.StringVar() self.font.set(font['family']) self.size = tk.StringVar() self.size.set(font['size']) self.style = tk.StringVar() self.style.set(combine_style(font)) tk.Toplevel.__init__(self, parent) # region # ...(comment PyCharm folding) placeholder_C0_label=tk.Label( self, text='-', width=1, foreground=parent.cget('bg')) frame_l = ttk.Frame(self) entry_font_label = tk.Label(frame_l, text='Art:') entry_font = ttk.Entry(frame_l, textvariable=self.font) frame_list_font = ttk.Frame(frame_l) listbox_font = tk.Listbox( frame_list_font, activestyle='none', height=7, width=30, bd=1) scroll_list_font = tk.Scrollbar(frame_list_font) self.fonts=list(tk_font.families()) self.fonts = [e for e in self.fonts if not('@'in e)] self.fonts.sort() for item in self.fonts: listbox_font.insert(tk.END, item) placeholder_C2_label=tk.Label( self, text='-', width=1, foreground=parent.cget('bg')) frame_m = ttk.Frame(self) entry_style_label=tk.Label(frame_m, text='Style') entry_style = ttk.Entry( frame_m, textvariable=self.style, width = 15) placeholder_C21_label=tk.Label( frame_m, text='-', width=1, foreground=parent.cget('bg')) entry_size_label=tk.Label(frame_m, text='Size:') entry_size = ttk.Entry(frame_m, textvariable=self.size, width = 5) frame_list_style = ttk.Frame(frame_m) listbox_style = tk.Listbox( frame_list_style, activestyle='none', height=7, width=15, bd=1) scroll_list_style = tk.Scrollbar(frame_list_style) self.styles=list(['Standard','Kursiv', 'Fett', 'Fett Kursiv']) for item in self.styles: listbox_style.insert(tk.END, item) frame_list_size = ttk.Frame(frame_m) listbox_size = tk.Listbox( frame_list_size, activestyle='none', height=7, width=5, bd=1) scroll_list_size = tk.Scrollbar(frame_list_size) self.sizes = list( ['8', '9', '10', '11', '12', '14', '16', '18','20', '22', '24']) for item in self.sizes: listbox_size.insert(tk.END, item) placeholder_C4_label = tk.Label( self, text='-', width=1, foreground=parent.cget('bg')) frame_r = ttk.Frame(self) placeholder_label = tk.Label( frame_r, text='-', width=1, foreground=parent.cget('bg')) button_apply = ttk.Button(frame_r, text='Apply', width=15) button_close = ttk.Button(frame_r, text='Close', width=15) button_cancel = ttk.Button(frame_r, text='Cancel', width=15) placeholder_C6_label=tk.Label( self, text='-', width=1, foreground=parent.cget('bg')) placeholder_C0_label.grid( row=0,column=0,padx=0, pady=5, sticky=tk.W+tk.N) frame_l.grid ( row=0,column=1,padx=0, pady=5, sticky=tk.W+tk.N) entry_font_label.grid ( row=0,column=0,padx=0, pady=0, sticky=tk.W) entry_font.grid ( row=1,column=0,padx=0, pady=1, sticky=tk.EW) frame_list_font.grid( row=2,column=0,padx=0, pady=0, sticky=tk.EW) listbox_font.pack(side=tk.LEFT) scroll_list_font.pack (side=tk.RIGHT, fill=tk.Y, expand=tk.NO) placeholder_C2_label.grid ( row=0,column=2,padx=0, pady=5, sticky=tk.W+tk.N) frame_m.grid( row=0,column=3,padx=0, pady=5, sticky=tk.N) entry_style_label.grid ( row=0,column=0,padx=0, pady=0, sticky=tk.W) entry_style.grid ( row=1,column=0,padx=0, pady=1, sticky=tk.EW) placeholder_C21_label.grid( row=0,column=1,padx=0, pady=0, sticky=tk.W+tk.N) entry_size_label.grid( row=0,column=2,padx=0, pady=0, sticky=tk.W) entry_size.grid( row=1,column=2,padx=0, pady=1, sticky=tk.EW) frame_list_style.grid(row=2,column=0,padx=0, pady=0, sticky=tk.EW) listbox_style.pack(side=tk.LEFT) scroll_list_style.pack(side=tk.RIGHT, fill=tk.Y, expand=tk.NO) frame_list_size.grid(row=2,column=2,padx=0, pady=0, sticky=tk.EW) listbox_size.pack(side=tk.LEFT) scroll_list_size.pack(side=tk.RIGHT, fill=tk.Y, expand=tk.NO) placeholder_C4_label.grid( row=0,column=4,padx=0, pady=5, sticky=tk.W+tk.N) frame_r.grid (row=0,column=5,padx=0, pady=5, sticky=tk.N) placeholder_label.grid(row=0,column=0,padx=0, pady=0, sticky=tk.W) button_apply.grid(row=1,column=0,padx=0, pady=0, sticky=tk.EW) button_close.grid( row=2,column=0,padx=0, pady=10, sticky=tk.EW) button_cancel.grid (row=3,column=0,padx=0, pady=0, sticky=tk.EW) placeholder_C6_label.grid( row=0,column=6,padx=0, pady=5, sticky=tk.W+tk.N) self.resizable(width=False, height=False) # endregion def get_font(event): # self.font.set(listbox_font.get(listbox_font.curselection())) # ____TEST____ > lb_fon_cur = listbox_font.curselection() lb_fon_get = listbox_font.get(lb_fon_cur) self.font.set(lb_fon_get) print('<>','def get_font: listbox_font.curselection()= ', lb_fon_cur,'listbox_font.get()=',lb_fon_get) return def get_style(event): # self.style.set(listbox_style.get(listbox_style.curselection())) # ____TEST____ > lb_sty_cur = listbox_style.curselection() lb_sty_get = listbox_style.get(lb_sty_cur) self.style.set(lb_sty_get) print('<>','def get_style: listbox_style.curselection()=', lb_sty_cur,'listbox_style.get()=',lb_sty_get) return def get_size(event): # self.size.set(listbox_size.get(listbox_size.curselection())) # ____TEST____ > lb_siz_cur = listbox_size.curselection() lb_siz_get = listbox_size.get(lb_siz_cur) self.size.set(lb_siz_get) print('<>','def get_size: listbox_size.curselection()= ', lb_siz_cur,'listbox_size.get()= ',lb_siz_get) return def cancel(): self.destroy() self.dialog_open_status[0] = False return scroll_list_font.configure(command=listbox_font.yview) listbox_font.configure(yscrollcommand=scroll_list_font.set) scroll_list_style.configure(command=listbox_style.yview) listbox_style.configure(yscrollcommand=scroll_list_style.set) scroll_list_size.configure(command=listbox_size.yview) listbox_size.configure(yscrollcommand=scroll_list_size.set) button_apply.config( command=lambda: self.text.config( font=(tk_font.Font( family=self.font.get(), size=int(self.size.get()), weight=splitt_style('weight'), slant=splitt_style('slant'))))) button_close.config(command=lambda: cancel()) button_cancel.config(command=lambda: cancel()) listbox_style.bind('<>', get_style) listbox_size.bind('<>', get_size) listbox_font.bind('<>', get_font) self.protocol("WM_DELETE_WINDOW", cancel) self.title('Font') self.lift(aboveThis=parent) return class editor(tk.Toplevel): def Font_Dialog_call(self, parent, text, open_status): if not open_status[0]: Font_Dialog(parent, text, open_status) open_status[0]= True return def __init__(self, parent, fit_text): self.fit_text=fit_text self.font_dialog_open = [False] tk.Toplevel.__init__(self, parent) self.title('editor-tk V') self.text_frame = \ tk.Text(master=self, height=30, width=91, wrap=tk.NONE, undo=True, maxundo=-1) if 'Consolas' in self.tk.call('font', 'families'): self.text_frame.config(font=('Consolas', 12)) self.text_frame.grid(row=0, column=0, sticky=tk.N+tk.S+tk.E+tk.W) self.status = tk.Frame(self, takefocus=False) self.line = tk.Label(self.status, text="Line 1 ") self.line.pack(side=tk.LEFT,fill=tk.Y) self.column = tk.Label(self.status, text="Column 0 ") self.column.pack(side=tk.LEFT,fill=tk.Y) self.status.grid(sticky="ew",row=3,column=0) self.grid_rowconfigure(0, weight=1) self.grid_columnconfigure(0, weight=1) menu = tk.Menu(self) self.config(menu=menu) fontmenu = tk.Menu(menu, tearoff=False) menu.add_cascade(label="Font", menu=fontmenu) fontmenu.add_command( label="Font ...",command=lambda: self.Font_Dialog_call( self, self.text_frame,self.font_dialog_open)) self.text_frame.insert('1.0', fit_text) self.text_frame.mark_set('insert','1.0') self.text_frame.see('1.0') if __name__ == '__main__': import sys import platform print('-'*90) print('platform ', platform.platform(), ' ', platform.machine(),'\n') print('python ', sys.version) print('tkinter ', tk.TkVersion) print('-'*90) text = '' for z in range(1, 30): text += 'example\n' root=tk.Tk() root.title('root') my_editor = editor(root, text) root.withdraw() my_editor.protocol("WM_DELETE_WINDOW", root.quit) root.mainloop()