PyKanjiCard-开源
- W8_948969了解作者
- 2MB文件大小
- zip文件格式
- 0收藏次数
- VIP专享资源类型
- 0下载次数
- 2022-06-14 22:05上传日期
PyKanjiCard是一种闪存卡程序,可帮助学习平假名,片假名和汉字中的日语书面单词。 您可以选择仅由已知字符组成的单词。 它是使用Pygtk用Python编写的。

pykanjicard-1.3.zip
- pykanjicard-1.3
- pykanjicard.py13.8KB
- pykanjiedit.py16.1KB
- PKG-INFO297B
- edict.py2.5KB
- README3KB
- pykanjicard.dict5.2MB
- setup.py480B
内容介绍
#!/usr/bin/env python
import gtk
import gobject
import pango
import os.path
import sys
###############################################################################
# @brief TextBuffer with undo
###############################################################################
class TextBuffer (gtk.TextBuffer):
def __init__(self, text=None):
gtk.TextBuffer.__init__ (self, text)
gobject.signal_new ("undo-modified", gtk.TextBuffer,
gobject.SIGNAL_RUN_LAST,
gobject.TYPE_BOOLEAN,
(gobject.TYPE_BOOLEAN,))
gobject.signal_new ("redo-modified", gtk.TextBuffer,
gobject.SIGNAL_RUN_LAST,
gobject.TYPE_BOOLEAN,
(gobject.TYPE_BOOLEAN,))
self.__actionlist = []
self.__actionidx = 0
self.__running = False
self.connect ("delete-range", self.__on_delete)
self.connect ("insert-text", self.__on_insert)
#############################################################################
# @brief Set text
#############################################################################
def set_text (self, text):
self.__running = True
gtk.TextBuffer.set_text (self, text)
self.__actionlist = []
self.__actionidx = 0
self.__running = False
#############################################################################
# @brief Undo last action
#############################################################################
def undo (self):
self.__running = True
cmd, pos, text, length = self.__pop_undo_action ()
if cmd:
iter = self.get_iter_at_offset (pos)
if cmd == 'INSERT':
end = self.get_iter_at_offset (pos + length)
self.delete (iter, end)
elif cmd == 'DELETE':
self.insert (iter, text)
self.__running = False
#############################################################################
# @brief Redo last action
#############################################################################
def redo (self):
self.__running = True
cmd, pos, text, length = self.__pop_redo_action ()
if cmd:
iter = self.get_iter_at_offset (pos)
if cmd == 'INSERT':
self.insert (iter, text)
elif cmd == 'DELETE':
end = buffer.get_iter_at_offset (pos + length)
self.delete (iter, end)
self.__running = False
#############################################################################
# @brief Register an action for undo
#############################################################################
def __push_action (self, action, pos, text, length):
if self.__actionidx < len (self.__actionlist):
self.__actionlist[self.__actionidx] = (action, pos, text, length)
else:
self.__actionlist.append ((action, pos, text, length))
if self.__actionidx == 0:
self.emit ('undo-modified', True)
self.__actionidx += 1
#############################################################################
# @brief Get last action for undo
#############################################################################
def __pop_undo_action (self):
if self.__actionidx > 0:
self.__actionidx -= 1
ret = self.__actionlist[self.__actionidx]
if self.__actionidx == 0:
self.emit ('undo-modified', False)
else:
ret = (None, None, None, None)
return ret
#############################################################################
# @brief Get last action for redo
#############################################################################
def __pop_redo_action (self):
if self.__actionidx < len (self.__actionlist):
ret = self.__actionlist[self.__actionidx]
if self.__actionidx == 0:
self.emit ('undo-modified', True)
self.__actionidx += 1
else:
ret = (None, None, None, None)
return ret
#############################################################################
# @brief Event: delete
#############################################################################
def __on_delete (self, widget, start, end, data=None):
if not self.__running:
text = self.get_text (start, end)
length = len (unicode (text, 'utf-8'))
self.__push_action ('DELETE', start.get_offset (), text, length)
#############################################################################
# @brief Event: insert
#############################################################################
def __on_insert (self, widget, iter, text, length, data=None):
if not self.__running:
length = len (unicode (text, 'utf-8'))
self.__push_action ('INSERT', iter.get_offset (), text, length)
###############################################################################
# @brief Editor window
###############################################################################
class MainWindow:
#############################################################################
# @brief Fill buffer from a file
#############################################################################
def open_file (self, filename):
buffer = self.text.get_buffer ()
fp = open (filename, "r")
buffer.set_text (fp.read ().decode ("euc_jp").encode ("utf-8"))
fp.close ()
buffer.set_modified (False)
self.save_button.set_sensitive (False)
self.save_menuitem.set_sensitive (False)
self.filename = filename
#############################################################################
# @brief Save current buffer to a file
#############################################################################
def save_file (self):
buffer = self.text.get_buffer()
fp = open (self.filename, "w")
start, end = buffer.get_bounds ()
fp.write (buffer.get_text(start, end).decode("utf-8").encode("euc_jp"))
fp.close ()
buffer.set_modified (False)
self.save_button.set_sensitive (False)
self.save_menuitem.set_sensitive (False)
#############################################################################
# @brief save file
#############################################################################
def on_save (self, widget, data=None):
self.save_file ()
#############################################################################
# @brief quit
#############################################################################
def on_quit (self, widget, data=None):
buffer = self.text.get_buffer ()
if buffer.get_modified():
dialog = gtk.MessageDialog(self.window,
gtk.DIALOG_MODAL,
gtk.MESSAGE_QUESTION,
gtk.BUTTONS_YES_NO,
"Save changes to 'pykanjicard.dict'?")
dialog.add_button (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL)
rc = dialog.run ()
dialog.destroy ()
if rc == gtk.RESPONSE_YES:
self.save_file ()
elif rc == gtk.RESPONSE_NO:
pass
else:
return False
gtk.main_quit ()
#############################################################################
# @brief Executed for the first time text went modified
#############################################################################
def on_text_modified (self, buffer, data=None):
self.save_button.set_sensitive (True)
self.save_menuitem.set_sensitive (True)
#############################################################################
# @brief Executed when undo status is modified
#############################################################################
def on_undo_modified (self, widget, flag, data=None):
self.undo_button.set_sensitive (flag)
self.undo_menuitem.set_sensitive (flag)
#############################################################################
# @brief Undo last change
#############################################################################
def on_undo (self, wi
评论



相关推荐
最新资源