Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/python
- #coding: utf-8
- # Блокнот, тестируется в Linux, автор AZJIO
- # v0.2, добавлены быстые клавиши
- # http://pastebin.com/cFYyf1Bc
- from Tkinter import *
- import tkFileDialog
- import tkMessageBox as box
- import datetime
- import tkColorChooser
- import os.path
- import ConfigParser
- # from ttk import Frame, Button, Label, Style
- # import time
- # box.showerror("Error", "Could not open file")
- # box.showwarning("Warning", "Deprecated function call")
- # box.askquestion("Question", "Are you sure to quit?")
- # box.showinfo("Information", "Download completed")
- # Глобальные переменные
- cur_path = '' # Текущий открытый путь к файлу
- def sel_cut():
- string = textbox.get(SEL_FIRST, SEL_LAST) # Получить выделенный текст. А если не выделенно, тогда что?
- root.clipboard_append(string) # Помещает в буфер обмена
- textbox.delete(SEL_FIRST, SEL_LAST) # Очищаем выделенное
- def sel_copy():
- string = textbox.get(SEL_FIRST, SEL_LAST) # Получить выделенный текст. А если не выделенно, тогда что?
- root.clipboard_append(string) # Помещает в буфер обмена
- def clipboard_paste():
- string = root.clipboard_get() # Получает содержимое буфер обмена
- textbox.insert(INSERT, string) # Вставляет текст в позицию текстового курсора
- def text_config():
- # Тут менять шрифт, ещё что нибудь
- (rgb, hx) = tkColorChooser.askcolor()
- textbox.config(bg=hx) # Конфигурирование методом
- # textbox.config(font='Arial 34', wrap='word') # Конфигурирование методом
- def text_fg_color():
- (rgb, hx) = tkColorChooser.askcolor(cfg_color_fg, title='Цвет шрифта')
- if not hx and hx is None:
- return
- textbox.config(fg=hx) # Конфигурирование методом
- cfg.set('setting', 'color_fg', hx)
- with open(path_setting, 'wb') as f:
- cfg.write(f)
- # print hx
- # print rgb # Возвращает кортеж
- def text_bg_color():
- (rgb, hx) = tkColorChooser.askcolor(cfg_color_bg, title='Цвет фона')
- if not hx and hx is None:
- return
- textbox.config(bg=hx) # Конфигурирование методом
- cfg.set('setting', 'color_bg', hx) # Устанавливает значение параметру цвета фона
- with open(path_setting, 'wb') as f: # Сохраняет настройки
- cfg.write(f)
- def about():
- box.showinfo("О программе", "Блокнот v0.1")
- def close_win():
- global root
- root.destroy()
- # print 'тест'
- def insert_date():
- textbox.insert(INSERT, datetime.date.today()) # Вставляет текущую дату в позицию курсора
- def new_file(event):
- global cur_path
- cur_path = '' # Обнуляем путь к файлу
- textbox.delete('1.0', 'end') # Очищаем окно редактирования
- def open_file(event):
- ftypes = [('Все файлы', '*'), ('txt файлы', '*.txt'), ('Файлы Python', '*.py')] # Фильтр файлов
- fn = tkFileDialog.Open(root, filetypes = ftypes).show()
- if not fn:
- return
- try:
- f = open(fn, 'rd') # Открывает файл для чтения
- except:
- return # Вылет, если не удалось открыть файл
- else:
- string = f.read() # читаем их файла
- f.close() # Закрываем файл после записи
- textbox.delete('1.0', 'end') # Очищаем окно редактирования
- textbox.insert('1.0', string) # Вставляем текст в окно редактирования
- # open(fn, 'rt') почему rt ?
- global cur_path
- cur_path = fn # Храним путь к открытому файлу
- def save_file_write():
- global cur_path
- path_parent = os.path.dirname(cur_path)
- if not os.path.exists(path_parent): # Если не существует родительский путь, то
- os.makedirs('test/testfolder') # Создаёт все папки по указанному пути
- try:
- f = open(cur_path, 'wd') # Открывает файл для записи
- except:
- return # Вылет, если не удалось открыть файл
- else:
- string = textbox.get('1.0', 'end').encode('utf-8') # Получить текст для записи в файл
- f.write(string) # пишем в файл
- f.close() # Закрываем файл после записи
- def save_file(event):
- global cur_path
- if cur_path: # Если файл задан
- save_file_write()
- else: # Иначе, если файл новый
- save_file_as(None)
- def save_file_as(event):
- ftypes = [('Все файлы', '*'), ('txt файлы', '*.txt'), ('Файлы Python', '*.py')] # Фильтр файлов
- tmp_path = tkFileDialog.SaveAs(root, filetypes = ftypes).show()
- if not tmp_path:
- return
- # if not fn.endswith(".txt"): # Добавить расширение... а пользователь этого точно хочет?
- # fn+=".txt"
- # open(fn, 'wt') почему wt ?
- global cur_path
- cur_path = tmp_path
- save_file_write()
- # Конфигурация
- cfg_def = {'color_bg': '#FFFFFF', 'color_fg': '#000000'} # Задаём найстройки по умолчанию
- cfg = ConfigParser.ConfigParser(cfg_def) # Создаём объект cfg
- path_setting = './setting.cfg'
- if os.path.exists(path_setting): # Если существует ini-файл, то
- cfg.read(path_setting) # Чтение данных в объект config
- cfg_color_bg = cfg.get('setting', 'color_bg') # Цвет фона
- cfg_color_fg = cfg.get('setting', 'color_fg') # Цвет шрифта
- else:
- # Если не существует, то заполняем объект с нуля параметрами по умолчанию
- cfg.add_section('setting')
- cfg.set('setting', 'color_bg', '#FFFFFF')
- cfg.set('setting', 'color_fg', '#000000')
- cfg_color_bg = cfg.get('setting', 'color_bg') # Цвет фона
- cfg_color_fg = cfg.get('setting', 'color_fg') # Цвет шрифта
- with open(path_setting, 'wb') as configfile:
- cfg.write(configfile)
- # Будем ли сохранять триггер запрета записи, чтобы не досить хард?
- # try:
- # f = open(path_setting, 'wd') # Открывает файл для записи
- # except:
- # trg_write = 0
- # print 'не удалось создать файл' # Вылет, если не удалось открыть файл
- # else:
- # trg_write = 1
- # f.close() # Закрываем файл после записи# Конфигурация
- # Выяснена проблема цвета. При вводе в поле своего варианта нужно нажать Enter
- # print cfg_color_bg
- # print cfg_color_fg
- root = Tk()
- root.title("Блокнот")
- # Центрируем окно
- whxy = [600, 340, 0, 0, 0]
- sw = root.winfo_screenwidth()
- sh = root.winfo_screenheight()
- whxy[2] = (sw - whxy[0])/2
- whxy[3] = (sh - whxy[1])/2
- root.geometry('%dx%d+%d+%d' % (whxy[0], whxy[1], whxy[2], whxy[3]))
- # root.geometry("250x150+300+300")
- # root.maxsize(1000, 400) # Максимальный размер окна
- root.minsize(200, 150) # Минимальный размер окна
- # root.centerWindow()
- root.protocol('WM_DELETE_WINDOW', close_win) # обработчик закрытия окна
- # _____________________________ Меню _____________________________
- menubar = Menu(root) # Создаёт меню
- root.config(menu=menubar) # Назначает меню в родительское окно
- fileMenu = Menu(menubar, tearoff=0) # Создаёт меню "Файл"
- menubar.add_cascade(label="Файл", underline=0, menu=fileMenu)
- # Добавляет команды в меню "Файл"
- fileMenu.add_command(label="Новый", underline=0, accelerator = 'Ctrl+N', command=new_file)
- fileMenu.add_command(label="Открыть...", underline=0, accelerator = 'Ctrl+O', command=open_file)
- fileMenu.add_command(label="Сохранить", underline=0, accelerator = 'Ctrl+S', command=save_file)
- fileMenu.add_command(label="Сохранить как...", underline=0, accelerator = 'Ctrl+Shift+S', command=save_file_as)
- fileMenu.add_separator() # Разделитель
- fileMenu.add_command(label="Выход", underline=0, command=close_win)
- # Связываем горячие клавиши с событиями
- root.bind_class(root, '<Control-n>', new_file)
- root.bind_class(root, '<Control-o>', open_file)
- root.bind_class(root, '<Control-s>', save_file)
- root.bind_class(root, '<Control-Shift-S>', save_file_as)
- # root.bind_class(root, '<Control-W>', close_win)
- editMenu = Menu(menubar, tearoff=0) # Создаёт меню "Правка"
- menubar.add_cascade(label="Правка", underline=0, menu=editMenu)
- # Добавляет команды в меню "Правка"
- # editMenu.add_command(label="Отменить", underline=0, command=about)
- # editMenu.add_command(label="Вернуть", underline=0, command=about)
- # editMenu.add_separator() # Разделитель
- editMenu.add_command(label="Вырезать", underline=0, command=sel_cut)
- editMenu.add_command(label="Копировать", underline=0, command=sel_copy)
- editMenu.add_command(label="Вставить", underline=0, command=clipboard_paste)
- editMenu.add_separator() # Разделитель
- editMenu.add_command(label="Вставить дату", underline=0, command=insert_date)
- editMenu = Menu(menubar, tearoff=0) # Создаёт меню "Настройки"
- menubar.add_cascade(label="Настройки", underline=0, menu=editMenu)
- # Добавляет команды в меню "Настройки"
- editMenu.add_command(label="Цвет шрифта", underline=0, command=text_fg_color)
- editMenu.add_command(label="Цвет фона", underline=0, command=text_bg_color)
- helpMenu = Menu(menubar, tearoff=0) # Создаёт меню "Справка"
- menubar.add_cascade(label="Справка", underline=0, menu=helpMenu)
- # Добавляет команды в меню "Справка"
- helpMenu.add_command(label="Справка", underline=0, command=about)
- helpMenu.add_command(label="О программе", underline=0, command=about)
- # submenu = Menu(fileMenu)
- # fileMenu.add_cascade(label='Импорт', menu=submenu, underline=0)
- #
- # submenu.add_command(label="Новый")
- # submenu.add_command(label="Метки")
- # submenu.add_command(label="Почта")
- # _____________________________ Фреймы _____________________________
- # panelFrame = Frame(root, height = 35, bg = 'gray')
- # textFrame = Frame(root, height = 340, width = 600)
- textFrame = Frame(root)
- # panelFrame.pack(side = 'top', fill = 'x')
- textFrame.pack(side = 'top', fill = 'both', expand = 1)
- textbox = Text(textFrame, wrap='word')
- textbox.config(fg=cfg_color_fg, bg=cfg_color_bg) # Конфигурирование методом
- # textbox.config(fg=cfg_color_fg, bg='#3f3f3f') # Конфигурирование методом
- # textbox.config(font='Arial 34', wrap='word') # Конфигурирование методом
- scrollbar = Scrollbar(textbox)
- scrollbar['command'] = textbox.yview
- textbox['yscrollcommand'] = scrollbar.set
- textbox.pack(side = 'left', fill = 'both', expand = 1)
- scrollbar.pack(side = 'right', fill = 'y')
- # loadBtn = Button(panelFrame, text = 'Открыть')
- # saveBtn = Button(panelFrame, text = 'Сохранить')
- # quitBtn = Button(panelFrame, text = 'Выход')
- #
- # loadBtn.bind("<Button-1>", load_file)
- # saveBtn.bind("<Button-1>", save_file)
- # quitBtn.bind("<Button-1>", close_win)
- #
- # loadBtn.place(x = 5, y = 5, width = 70, height = 27)
- # saveBtn.place(x = 80, y = 5, width = 80, height = 27)
- # quitBtn.place(x = 165, y = 5, width = 70, height = 27)
- root.mainloop()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement