Форум сайта python.su
Добрый день , подскажите пожалуйста как можно в моей проект добавить менюшку где есть различные текстовые эффекты , например поменять шрифт, размер или сделать жирным шрифт , если опишите подробнее я буду очень благодарен, думаю, что тут нужно combobox ,но понятий не имею как написать это в единое , что бы это работало.
Код ниже.
import sys import logging logging.basicConfig(level=logging.INFO) L, A = 500, 500 if not sys.version.startswith('3.1'): from tkinter import * from tkinter import filedialog from tkinter import messagebox from tkinter import ttk from os import path else: raise ValueError('Python version is not supported') class StatusBar: """ строка состояния tkinter """ def __init__(self, master=None, init_text=None): self.status = Label(master, text=init_text, bd=1, anchor=E, relief=SUNKEN) self.status.pack(side=BOTTOM, fill=X) def set_text(self, text): self.status['text'] = text def append_text(self, text): self.status['text'] += ' | ' + text def get_text(self): return self.status['text'] class MainWindow(Tk): """ Показывает статус бар """ def __init__(self, title): super().__init__() self.ext = '' self.title(title) self.minsize(L, A) self.geometry("%dx%d" % (L, A)) self.notebook = ttk.Notebook(self) self.tab = ttk.Frame(self.notebook) self.tab.pack() self.status_bar = StatusBar(self.tab, "Жду пока ты начнешь писать...") self.other = ttk.Frame(self.notebook) self.other.pack() self.create_interface(self.tab) self.bind("<Control-n>", self.new_tab) self.bind("<Delete>", self.delete_last_tab) self.mainloop() def create_interface(self, tab=None): self.tab = tab self.frame = ttk.Frame(self.tab) self.frame.pack() self.frame_y = ttk.Frame(self.tab) self.frame_z = ttk.Frame(self.tab) self.frame_z.pack() self.frame_y.pack(fill=BOTH, expand=1) self.open = Button(self.frame, text="Открыть", width=15, relief=FLAT, command=self.openfile) self.open.pack(side=LEFT) self.save = Button(self.frame, text="Cохранить", width=15, relief=FLAT, command=self.save) self.save.pack(side=LEFT) self.new_tab_bt = Button(self.frame, text="Создать заметку", width=15, relief=FLAT, command=self.new_tab) self.new_tab_bt.pack(side=LEFT) self.help_bt = Button(self.frame, text="Помощь", relief=FLAT, command=self.help) self.help_bt.pack(side=LEFT) # текстовое поле для пользователя scroll_text = Scrollbar(self.frame_y) scroll_text.pack(side=RIGHT, fill=Y, pady=5) self.text = Text(self.frame_y, width=80, yscrollcommand=scroll_text.set, wrap=WORD, undo=True) # сочетания клавиш self.text.bind("<KeyPress>", self.count_all) self.text.bind("<Control-s>", self.save) # Нажатие Ctrl + S будет сохранить файл как self.text.bind("<Control-o>", self.openfile) # Нажатие CTRL+O будет открыть файл self.text.bind("<Control-a>", self.select_all) # scroll_text.config(command=self.text.yview) self.text.pack(fill=BOTH, expand=1) self.notebook.add(self.tab, text="No name") self.notebook.pack(expand=1, fill="both") def new_tab(self, e=None): """ Создает новую вкладку :c """ master = self.other master = ttk.Frame(self.notebook) master.pack() self.create_interface(master) tabs = self.notebook.tabs() tabs_l = [self.notebook.index(tab) for tab in tabs] self.notebook.select(tabs_l[-1]) def delete_last_tab(self, e=None): """ чтобы закрыть последнюю вкладку """ tabs = self.notebook.tabs() tabs_l = [self.notebook.index(tab) for tab in tabs] if len(tabs_l) > 1: self.notebook.forget(tabs_l[-1]) def openfile(self, e=None): """ Открыть файл """ fname = filedialog.askopenfilename() self.clear() if fname: idx = self.notebook.index(self.notebook.select()) self.notebook.forget(idx) name = fname[::-1] name = name[:name.find('/'):] name = name[::-1] self.ext = name[name.find('.')::] name = name[:name.find('.'):] self.notebook.add(self.tab, text=name) try: with open(fname, encoding='utf-8') as f: lines = f.readlines() for line, content in enumerate(lines): self.text.insert(float(line) + 1, content) except UnicodeDecodeError as e: logging.info("Ошибка%s" % e) logging.info("жаль но вы допустили ошибочку..") with open(fname) as f: lines = f.readlines() for line, content in enumerate(lines): self.text.insert(float(line) + 1, content) except FileNotFoundError: logging.info("Файл% S не найден" % fname) self.count_all() self.notebook.select(idx) def save_as(self, e=None): """ Функция, чтобы сохранить как открытие окна просит пользователя сообщить имя конечного файла """ txt = self.text.get(1.0, END) fname = filedialog.asksaveasfilename(filetypes=[("Text Files", "txt")]) if fname: idx = self.notebook.index(self.notebook.select()) self.notebook.forget(idx) name = fname[::-1] name = name[:name.find('/'):] name = name[:name.find('.'):-1] self.notebook.add(self.tab, text=name) with open(fname, 'w+') as f: f.write(txt) else: messagebox.showinfo("Уведомление", "Вы должны поставить имя") def save(self, e=None): """ Если файл уже существует в папке с тем же именем, это сохранить но, за исключением, как это называется """ idx = self.notebook.index(self.notebook.select()) fname = self.notebook.tab(idx)['text'] + self.ext if path.isfile(fname): with open(fname, "w") as f: f.write(self.text.get(1.0, END)) else: self.save_as() def count_words(self): """ счета слов """ txt = self.text.get(1.0, END) if len(txt) >= 1: txt = txt.split() self.status_bar.set_text("слова: " + str(len(txt))) def count_chars(self): """ счет символов""" txt = self.text.get(1.0, END) if len(txt) >= 1: txt = list(txt) self.status_bar.append_text("Символов: " + str(len(txt))) def count_lines(self): """ счета строк """ if len(self.text.get(1.0, END)) >= 1: self.status_bar.append_text("строк: " + str(int(self.text.index('end').split('.')[0])-1)) def count_all(self, e=None): """ Метод, который выполняет другие три счетчика методы""" self.count_words() self.count_chars() self.count_lines() def clear(self): """ Этот метод ясно только по имени... """ self.text.delete(1.0, END) def select_all(self, e=None): """ чтобы выбрать все c клавиатуры ctrl+a :x """ self.text.tag_add(SEL, "1.0", END) self.text.mark_set(INSERT, "1.0") self.text.see(INSERT) return 'break' @staticmethod def help(): """ Окно помощи """ help_window = Toplevel() help_window.title('Помощь') help_window.minsize(200, 130) help_window.resizable(0, 0) Message(help_window, text="Чтобы удалить заметку нажмите: <Delete>\n\nСоздать: <Ctrl+N>\ \n\nRAZRAB MARIK ", justify=LEFT).pack(pady=15) btn_close = Button(help_window, text="Закрыть", command=help_window.destroy) btn_close.pack(fill=X) MainWindow('Заметки.')
Офлайн
up
Офлайн
Поясните поподробнее, что нужно? Вы не знаете как меню в Tkinter создавать? Или как при выборе меню назначать эффект?
P.S. Ну и весь свой код выкладывать все же не стоит. Народу тупо некогда будет его читать. Просто можно сделать маленький кусочек и описать свой вопрос.
Офлайн
4kpt_VМне бы пример функции , которая меняет текстовый стиль написания
Поясните поподробнее, что нужно? Вы не знаете как меню в Tkinter создавать? Или как при выборе меню назначать эффект?P.S. Ну и весь свой код выкладывать все же не стоит. Народу тупо некогда будет его читать. Просто можно сделать маленький кусочек и описать свой вопрос.
Офлайн
Офлайн
4kpt_VСпасибо большое оооо добрый человек!))
прямой ответПодробнее
Офлайн
Что-то у меня шляпа какая-то с добавлением текстового стиля в проекте ,помогите менюшку в прогу добавить….
которая написана ниже.
#!/usr/bin/env python3 import tkinter as tk from tkinter.font import Font class Pad(tk.Frame): def __init__(self, parent, *args, **kwargs): tk.Frame.__init__(self, parent, *args, **kwargs) self.toolbar = tk.Frame(self, bg="#eee") self.toolbar.pack(side="top", fill="x") self.bold_btn = tk.Button(self.toolbar, text="Bold", command=self.make_bold) self.bold_btn.pack(side="left") self.clear_btn = tk.Button(self.toolbar, text="Clear", command=self.clear) self.clear_btn.pack(side="left") # Creates a bold font self.bold_font = Font(family="Helvetica", size=14, weight="bold") self.text = tk.Text(self) self.text.insert("end", "Select part of text and then click 'Bold'...") self.text.focus() self.text.pack(fill="both", expand=True) # configuring a tag called BOLD self.text.tag_configure("BOLD", font=self.bold_font) def make_bold(self): # tk.TclError exception is raised if not text is selected try: self.text.tag_add("BOLD", "sel.first", "sel.last") except tk.TclError: pass def clear(self): self.text.tag_remove("BOLD", "1.0", 'end') def demo(): root = tk.Tk() Pad(root).pack(expand=1, fill="both") root.mainloop() if __name__ == "__main__": demo()
Офлайн
по “менюшкой” подразумеваеться главное меню? типа файл, открыть, вид и т.д.?
import tkinter as tk from tkinter.font import Font from tkinter import Menu def do_something(): print('program doing somethig....') class Pad(tk.Frame): def __init__(self, parent, *args, **kwargs): tk.Frame.__init__(self, parent, *args, **kwargs) self.toolbar = tk.Frame(self, bg="#eee") self.toolbar.pack(side="top", fill="x") #self.bold_btn = tk.Button(self.toolbar, text="Bold", command=self.make_bold) #self.bold_btn.pack(side="left") #self.clear_btn = tk.Button(self.toolbar, text="Clear", command=self.clear) #self.clear_btn.pack(side="left") # Creates a bold font self.bold_font = Font(family="Helvetica", size=14, weight="bold") self.text = tk.Text(self) self.text.insert("end", "Select part of text and then click 'Bold'...") self.text.focus() self.text.pack(fill="both", expand=True) # configuring a tag called BOLD self.text.tag_configure("BOLD", font=self.bold_font) def make_bold(self): # tk.TclError exception is raised if not text is selected try: self.text.tag_add("BOLD", "sel.first", "sel.last") except tk.TclError: pass def clear(self): self.text.tag_remove("BOLD", "1.0", 'end') def demo(): root = tk.Tk() pad = Pad(root) pad.pack(expand=1, fill="both") # --- Добавляем главное меню --- m = Menu(root) root.config(menu=m) #----- меню "Фалй" ----- file_menu = Menu(m) m.add_cascade(label="File",menu=file_menu) file_menu.add_command(label="Open...",command=do_something) file_menu.add_command(label="Save...",command=do_something) file_menu.add_separator() file_menu.add_command(label="Exit",command=root.destroy) # ---- Меню "Шрифт" font_menu = Menu(m) m.add_cascade(label="Font",menu=font_menu) font_menu.add_command(label="Normal",command=pad.clear) font_menu.add_command(label="Bold",command=pad.make_bold) font_menu.add_command(label="Italic",command=pad.make_bold) # ----- меню "Помощ" ---- help_menu = Menu(m) m.add_cascade(label="?",menu=help_menu) help_menu.add_command(label="About",command=do_something) # --- Конец добавления главного меню root.mainloop() if __name__ == "__main__": demo()
[code python][/code]
Офлайн
PEHDOM
Все верно, только зачем создание меню вынесли вне класса?
С таким меню Вы всегда будете ожидать pad…
Офлайн
Это же только пример, никто не мешает автору поместисть создание меню в этот класс, или вынести в отдельный класс. Или разнести, чтобы файл и помощ создавались отдельно, а класс потом добавлял свои пункы меню с сылками на свои методы.
[code python][/code]
Отредактировано PEHDOM (Март 29, 2017 13:40:31)
Офлайн