⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 traygui.py

📁 memcard is a multiplaform flashcard word learning software written on a python language. (tested on
💻 PY
字号:
#!/usr/bin/python# vim: set fileencoding=utf-8#    Copyright 漏 2008 Igor Mammedov,#    Contact email: igor@mammed.net##    This file is part of MemoCard.##    MemoCard is free software: you can redistribute it and/or modify#    it under the terms of the GNU General Public License as published by#    the Free Software Foundation, either version 3 of the License, or#    (at your option) any later version.##    MemoCard is distributed in the hope that it will be useful,#    but WITHOUT ANY WARRANTY; without even the implied warranty of#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the#    GNU General Public License for more details.##    You should have received a copy of the GNU General Public License#    along with MemoCard.  If not, see <http://www.gnu.org/licenses/>.import gtkimport gobjectimport ConfigParserfrom trayicon import TrayIconimport flashcardimport carddbimport jmemorize_dbclass TrayApp:	def get_default_config(self):		config = ConfigParser.RawConfigParser()		config.add_section('GUI')		config.set('GUI', 'CardWindowY', '15')		config.set('GUI', 'CardWindowY', '15')		config.add_section('Learning')		config.set('Learning', 'SlideTimeout', '10')		config.set('Learning', 'SlideInterval', '40')		config.set('Learning', 'FlipSides', 'false')		config.set('Learning', 'DefaultDB', 'french.jml')		return config	def __init__(self):		self.config = ConfigParser.RawConfigParser()		try:			self.config.readfp(open('memocard.cfg'))		except:			self.config = self.get_default_config()		self.flip = self.config.getboolean('Learning', 'FlipSides')		self.icon = TrayIcon()		self.icon.connect('activate', self.slide_show_cb)		# Build menu		menu = gtk.Menu()		self.topMenu = menu		menuItem = gtk.MenuItem('Start/Stop slide show')		menuItem.connect('activate', self.slide_show_cb)		self.slide_show_mode = False		menu.append(menuItem)		menuItem = gtk.CheckMenuItem('Flip cards')		menuItem.connect('activate', self.flip_cb)		menu.append(menuItem)		menuItem = gtk.ImageMenuItem(gtk.STOCK_QUIT)		menuItem.connect('activate', self.quit_cb, self.icon)		menu.append(menuItem)		self.icon.connect('popup-menu', self.popup_menu_cb, menu)		self.icon.show()		# Init cards database		self.db = jmemorize_db.jMemorizeDB()		self.db.open_db(self.config.get('Learning', 'DefaultDB'))		# Add Filter menu Item if backend provides it		try:			flt = self.db.getFilter()			flt_menu = self.build_FilterMenu(flt)			if flt_menu != None:				menuItem = gtk.MenuItem('Filter')				menuItem.set_submenu(flt_menu)				menu.prepend(menuItem)				menu.connect('hide', self.setToolTip_from_filter)		except Exception, e:			print "Unable to get Filter menu from DB: ", e	def build_FilterMenu(self, filter):		menu = gtk.Menu()		menu.connect('button-press-event', self.Filter_Menu_Hide_cb)		for n in filter:			menuItem = gtk.MenuItem(n['name'])			menuItem.set_data('topMenu', self.topMenu)			menuItem.set_data('data', n['data'])			menuItem.connect('activate', self.setFilter)			menuItem.connect('button-press-event',					self.Filter_Menu_Hide_cb)			menu.append(menuItem)			if 'sublevel' in n:				submenu = self.build_FilterMenu(n['sublevel'])				if submenu != None:					menuItem.set_submenu(submenu)					submenu.set_data('topMenu', self.topMenu)		return menu	def setFilter(self, widget):		'''		Sets filter in DB using 'data' from activated menuItem		'''		self.db.setFilter(widget.get_data('data'))	def Filter_Menu_Hide_cb(self, widget, event):		'''		Makes MenuItem with submenu clickable, hides menu after		clicking on such item and provides activate signal for leaf		MenuItems because they do not emmit activate signal when		button-press-event event is connected to them		'''		if isinstance(widget, gtk.Menu):			widget.popdown()			m = widget.get_data('topMenu')			if m != None:				m.popdown()		elif isinstance(widget, gtk.MenuItem):			widget.activate()	def popup_menu_cb(self, widget, button, time, data = None):		if data:			data.show_all()			data.popup(None, None, None, 3, time)	def slide_show_cb(self, widget):		if self.slide_show_mode == False:			self.icon.slideshow()			self.slide_show_mode = True			self.slide_show()			gobject.timeout_add( self.config.getint('Learning',				'SlideInterval')*1000, self.slide_show)		else:			self.icon.pause()			self.slide_show_mode = False	def setToolTip_from_filter(self, widget = None):		tooltip_text = ''		try:			# getFilterDescription may raise exception in case of it is missing			# in DB Backend, so handle it gracefully			flt_list = self.db.getFilterDescription()			while len(flt_list):				i = flt_list.pop()				if tooltip_text == '':					tooltip_text = i				else:					tooltip_text = '%s / %s' % (tooltip_text, i)		except:			pass		if tooltip_text == '':			tooltip_text = 'Empty Filter'		self.icon.set_tooltip(tooltip_text)	def slide_show(self):		term = self.db.getCard()		if self.flip == True:			flashcard.show(term.tdef, term.tterm,					self.config.getint('Learning',						'SlideTimeout')*1000)		else:			flashcard.show(term.tterm, term.tdef,					self.config.getint('Learning',						'SlideTimeout')*1000)		return self.slide_show_mode	def flip_cb(self, widget):		if self.flip == True:			self.flip = False		else:			self.flip = True	def quit_cb(self, widget, data):		if data:			data.hide()		self.config.write(open('memocard.cfg','wb'))		gtk.main_quit()	def run(self):		gtk.main()

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -