Advertisement
AZJIO

Текстовый редактор

Sep 29th, 2014
891
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 11.96 KB | None | 0 0
  1. #!/usr/bin/python
  2. #coding: utf-8
  3.  
  4. # Блокнот, тестируется в Linux, автор AZJIO
  5. # v0.2, добавлены быстые клавиши
  6. # http://pastebin.com/cFYyf1Bc
  7.  
  8. from Tkinter import *
  9. import tkFileDialog
  10. import tkMessageBox as box
  11. import datetime
  12. import tkColorChooser
  13. import os.path
  14. import ConfigParser
  15. # from ttk import Frame, Button, Label, Style
  16. # import time
  17.  
  18. # box.showerror("Error", "Could not open file")
  19. # box.showwarning("Warning", "Deprecated function call")
  20. # box.askquestion("Question", "Are you sure to quit?")
  21. # box.showinfo("Information", "Download completed")
  22.  
  23. # Глобальные переменные
  24. cur_path = '' # Текущий открытый путь к файлу
  25.  
  26.  
  27. def sel_cut():
  28.     string = textbox.get(SEL_FIRST, SEL_LAST) # Получить выделенный текст. А если не выделенно, тогда что?
  29.     root.clipboard_append(string) # Помещает в буфер обмена
  30.     textbox.delete(SEL_FIRST, SEL_LAST) # Очищаем выделенное
  31.  
  32. def sel_copy():
  33.     string = textbox.get(SEL_FIRST, SEL_LAST) # Получить выделенный текст. А если не выделенно, тогда что?
  34.     root.clipboard_append(string) # Помещает в буфер обмена
  35.  
  36. def clipboard_paste():
  37.     string = root.clipboard_get() # Получает содержимое буфер обмена
  38.     textbox.insert(INSERT, string) # Вставляет текст в позицию текстового курсора
  39.  
  40. def text_config():
  41.     # Тут менять шрифт, ещё что нибудь
  42.     (rgb, hx) = tkColorChooser.askcolor()
  43.     textbox.config(bg=hx) # Конфигурирование методом
  44.     # textbox.config(font='Arial 34', wrap='word') # Конфигурирование методом
  45.  
  46. def text_fg_color():
  47.     (rgb, hx) = tkColorChooser.askcolor(cfg_color_fg, title='Цвет шрифта')
  48.     if not hx and hx is None:
  49.         return
  50.     textbox.config(fg=hx) # Конфигурирование методом
  51.     cfg.set('setting', 'color_fg', hx)
  52.     with open(path_setting, 'wb') as f:
  53.         cfg.write(f)
  54.     # print hx
  55.     # print rgb # Возвращает кортеж
  56.  
  57. def text_bg_color():
  58.     (rgb, hx) = tkColorChooser.askcolor(cfg_color_bg, title='Цвет фона')
  59.     if not hx and hx is None:
  60.         return
  61.     textbox.config(bg=hx) # Конфигурирование методом
  62.     cfg.set('setting', 'color_bg', hx) # Устанавливает значение параметру цвета фона
  63.     with open(path_setting, 'wb') as f: # Сохраняет настройки
  64.         cfg.write(f)
  65.  
  66. def about():
  67.     box.showinfo("О программе", "Блокнот v0.1")
  68.  
  69. def close_win():
  70.     global root
  71.     root.destroy()
  72.     # print 'тест'
  73.  
  74. def insert_date():
  75.     textbox.insert(INSERT, datetime.date.today()) # Вставляет текущую дату в позицию курсора
  76.  
  77. def new_file(event):
  78.     global cur_path
  79.     cur_path = '' # Обнуляем путь к файлу
  80.     textbox.delete('1.0', 'end') # Очищаем окно редактирования
  81.  
  82.  
  83. def open_file(event):
  84.     ftypes = [('Все файлы', '*'), ('txt файлы', '*.txt'), ('Файлы Python', '*.py')] # Фильтр файлов
  85.     fn = tkFileDialog.Open(root, filetypes = ftypes).show()
  86.     if not fn:
  87.         return
  88.  
  89.     try:
  90.         f = open(fn, 'rd') # Открывает файл для чтения
  91.     except:
  92.         return # Вылет, если не удалось открыть файл
  93.     else:
  94.         string = f.read() # читаем их файла
  95.         f.close() # Закрываем файл после записи
  96.     textbox.delete('1.0', 'end') # Очищаем окно редактирования
  97.     textbox.insert('1.0', string) # Вставляем текст в окно редактирования
  98.     # open(fn, 'rt') почему rt ?
  99.     global cur_path
  100.     cur_path = fn # Храним путь к открытому файлу
  101.  
  102.  
  103. def save_file_write():
  104.     global cur_path
  105.     path_parent = os.path.dirname(cur_path)
  106.     if not os.path.exists(path_parent): # Если не существует родительский путь, то
  107.         os.makedirs('test/testfolder') # Создаёт все папки по указанному пути
  108.     try:
  109.         f = open(cur_path, 'wd') # Открывает файл для записи
  110.     except:
  111.         return # Вылет, если не удалось открыть файл
  112.     else:
  113.         string = textbox.get('1.0', 'end').encode('utf-8') # Получить текст для записи в файл
  114.         f.write(string) # пишем в файл
  115.         f.close() # Закрываем файл после записи
  116.  
  117.  
  118. def save_file(event):
  119.     global cur_path
  120.     if cur_path: # Если файл задан
  121.         save_file_write()
  122.     else: # Иначе, если файл новый
  123.         save_file_as(None)
  124.  
  125. def save_file_as(event):
  126.     ftypes = [('Все файлы', '*'), ('txt файлы', '*.txt'), ('Файлы Python', '*.py')] # Фильтр файлов
  127.     tmp_path = tkFileDialog.SaveAs(root, filetypes = ftypes).show()
  128.     if not tmp_path:
  129.         return
  130.     # if not fn.endswith(".txt"): # Добавить расширение... а пользователь этого точно хочет?
  131.         # fn+=".txt"
  132.     # open(fn, 'wt') почему wt ?
  133.     global cur_path
  134.     cur_path = tmp_path
  135.     save_file_write()
  136.  
  137.  
  138. # Конфигурация
  139. cfg_def = {'color_bg': '#FFFFFF', 'color_fg': '#000000'} # Задаём найстройки по умолчанию
  140. cfg = ConfigParser.ConfigParser(cfg_def) # Создаём объект cfg
  141.  
  142. path_setting = './setting.cfg'
  143. if os.path.exists(path_setting): # Если существует ini-файл, то
  144.     cfg.read(path_setting) # Чтение данных в объект config
  145.     cfg_color_bg = cfg.get('setting', 'color_bg') # Цвет фона
  146.     cfg_color_fg = cfg.get('setting', 'color_fg') # Цвет шрифта
  147. else:
  148.     # Если не существует, то заполняем объект с нуля параметрами по умолчанию
  149.     cfg.add_section('setting')
  150.     cfg.set('setting', 'color_bg', '#FFFFFF')
  151.     cfg.set('setting', 'color_fg', '#000000')
  152.     cfg_color_bg = cfg.get('setting', 'color_bg') # Цвет фона
  153.     cfg_color_fg = cfg.get('setting', 'color_fg') # Цвет шрифта
  154.    
  155.     with open(path_setting, 'wb') as configfile:
  156.         cfg.write(configfile)
  157.    
  158.     # Будем ли сохранять триггер запрета записи, чтобы не досить хард?
  159.     # try:
  160.         # f = open(path_setting, 'wd') # Открывает файл для записи
  161.     # except:
  162.         # trg_write = 0
  163.         # print 'не удалось создать файл' # Вылет, если не удалось открыть файл
  164.     # else:
  165.         # trg_write = 1
  166.         # f.close() # Закрываем файл после записи# Конфигурация
  167.  
  168.  
  169. # Выяснена проблема цвета. При вводе в поле своего варианта нужно нажать Enter
  170. # print cfg_color_bg
  171. # print cfg_color_fg
  172.  
  173.  
  174.  
  175. root = Tk()
  176. root.title("Блокнот")
  177.  
  178. # Центрируем окно
  179. whxy = [600, 340, 0, 0, 0]
  180. sw = root.winfo_screenwidth()
  181. sh = root.winfo_screenheight()
  182. whxy[2] = (sw - whxy[0])/2
  183. whxy[3] = (sh - whxy[1])/2
  184. root.geometry('%dx%d+%d+%d' % (whxy[0], whxy[1], whxy[2], whxy[3]))
  185. # root.geometry("250x150+300+300")
  186.  
  187. # root.maxsize(1000, 400) # Максимальный размер окна
  188. root.minsize(200, 150) # Минимальный размер окна
  189. # root.centerWindow()
  190. root.protocol('WM_DELETE_WINDOW', close_win) # обработчик закрытия окна
  191.  
  192. # _____________________________ Меню _____________________________
  193. menubar = Menu(root) # Создаёт меню
  194. root.config(menu=menubar)  # Назначает меню в родительское окно
  195.  
  196. fileMenu = Menu(menubar, tearoff=0) # Создаёт меню "Файл"
  197. menubar.add_cascade(label="Файл", underline=0, menu=fileMenu)
  198.  
  199. # Добавляет команды в меню "Файл"
  200. fileMenu.add_command(label="Новый", underline=0, accelerator = 'Ctrl+N', command=new_file)
  201. fileMenu.add_command(label="Открыть...", underline=0, accelerator = 'Ctrl+O', command=open_file)
  202. fileMenu.add_command(label="Сохранить", underline=0, accelerator = 'Ctrl+S', command=save_file)
  203. fileMenu.add_command(label="Сохранить как...", underline=0, accelerator = 'Ctrl+Shift+S', command=save_file_as)
  204. fileMenu.add_separator()  # Разделитель
  205. fileMenu.add_command(label="Выход", underline=0, command=close_win)
  206.  
  207. # Связываем горячие клавиши с событиями
  208. root.bind_class(root, '<Control-n>', new_file)
  209. root.bind_class(root, '<Control-o>', open_file)
  210. root.bind_class(root, '<Control-s>', save_file)
  211. root.bind_class(root, '<Control-Shift-S>', save_file_as)
  212. # root.bind_class(root, '<Control-W>', close_win)
  213.  
  214. editMenu = Menu(menubar, tearoff=0) # Создаёт меню "Правка"
  215. menubar.add_cascade(label="Правка", underline=0, menu=editMenu)
  216.  
  217. # Добавляет команды в меню "Правка"
  218. # editMenu.add_command(label="Отменить", underline=0, command=about)
  219. # editMenu.add_command(label="Вернуть", underline=0, command=about)
  220. # editMenu.add_separator()  # Разделитель
  221. editMenu.add_command(label="Вырезать", underline=0, command=sel_cut)
  222. editMenu.add_command(label="Копировать", underline=0, command=sel_copy)
  223. editMenu.add_command(label="Вставить", underline=0, command=clipboard_paste)
  224. editMenu.add_separator()  # Разделитель
  225. editMenu.add_command(label="Вставить дату", underline=0, command=insert_date)
  226.  
  227. editMenu = Menu(menubar, tearoff=0) # Создаёт меню "Настройки"
  228. menubar.add_cascade(label="Настройки", underline=0, menu=editMenu)
  229.  
  230. # Добавляет команды в меню "Настройки"
  231. editMenu.add_command(label="Цвет шрифта", underline=0, command=text_fg_color)
  232. editMenu.add_command(label="Цвет фона", underline=0, command=text_bg_color)
  233.  
  234. helpMenu = Menu(menubar, tearoff=0) # Создаёт меню "Справка"
  235. menubar.add_cascade(label="Справка", underline=0, menu=helpMenu)
  236.  
  237. # Добавляет команды в меню "Справка"
  238. helpMenu.add_command(label="Справка", underline=0, command=about)
  239. helpMenu.add_command(label="О программе", underline=0, command=about)
  240.  
  241. # submenu = Menu(fileMenu)
  242. # fileMenu.add_cascade(label='Импорт', menu=submenu, underline=0)
  243. #
  244. # submenu.add_command(label="Новый")
  245. # submenu.add_command(label="Метки")
  246. # submenu.add_command(label="Почта")
  247.  
  248. # _____________________________ Фреймы _____________________________
  249. # panelFrame = Frame(root, height = 35, bg = 'gray')
  250. # textFrame = Frame(root, height = 340, width = 600)
  251. textFrame = Frame(root)
  252.  
  253.  
  254. # panelFrame.pack(side = 'top', fill = 'x')
  255. textFrame.pack(side = 'top', fill = 'both', expand = 1)
  256.  
  257. textbox = Text(textFrame, wrap='word')
  258. textbox.config(fg=cfg_color_fg, bg=cfg_color_bg) # Конфигурирование методом
  259. # textbox.config(fg=cfg_color_fg, bg='#3f3f3f') # Конфигурирование методом
  260. # textbox.config(font='Arial 34', wrap='word') # Конфигурирование методом
  261. scrollbar = Scrollbar(textbox)
  262.  
  263. scrollbar['command'] = textbox.yview
  264. textbox['yscrollcommand'] = scrollbar.set
  265.  
  266. textbox.pack(side = 'left', fill = 'both', expand = 1)
  267. scrollbar.pack(side = 'right', fill = 'y')
  268.  
  269. # loadBtn = Button(panelFrame, text = 'Открыть')
  270. # saveBtn = Button(panelFrame, text = 'Сохранить')
  271. # quitBtn = Button(panelFrame, text = 'Выход')
  272. #
  273. # loadBtn.bind("<Button-1>", load_file)
  274. # saveBtn.bind("<Button-1>", save_file)
  275. # quitBtn.bind("<Button-1>", close_win)
  276. #
  277. # loadBtn.place(x = 5, y = 5, width = 70, height = 27)
  278. # saveBtn.place(x = 80, y = 5, width = 80, height = 27)
  279. # quitBtn.place(x = 165, y = 5, width = 70, height = 27)
  280.  
  281. root.mainloop()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement