`
ph4nut
  • 浏览: 5793 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
最近访客 更多访客>>
社区版块
存档分类
最新评论

wxGDT - [Gmail同步未完成]

阅读更多
wxGDT是我为自己写的一个简便的GDT工具,平时都用Gmail来做GDT管理。考虑到应该有个离线的GDT工具,而且也未找到适合自己风格的替代品,于是写了一个。功能欠缺Gmail同步模块,待增加!

数据保存:用pickle module保存于同目录文件下.
截图:


代码:

#!/usr/bin/python
'''
File: wxGTD.py
Author: Twilight
Description: Get Things Done tool coded with wxPython
'''

import wx
import pickle

category = {}

class NewFrame(wx.Frame):
    def __init__(self,main,id=-1,size=(100,200),type="Category",style=wx.CAPTION|wx.SYSTEM_MENU|wx.CLOSE_BOX):
	wx.Frame.__init__(self,main,-1,"New Things",(0,0),size,style=style)
	self.SetBackgroundColour(wx.WHITE)
	self.panel = wx.Panel(self,-1)
	self.CenterOnScreen()
	if type == "Category":	#Default "Category"
	    self.staticText = wx.StaticText(self.panel,-1,"Enter a category:",(5,25),(-1,20))
	    self.staticText.SetFont(main.font)
	    self.categoryText = wx.TextCtrl(self.panel,-1,pos=(100,20),size=(130,20))
	    self.categoryText.SetFont(main.font)
	    self.button = wx.Button(self.panel,-1,"New",pos=(235,20),size=(63,22))
	    self.button.SetFont(main.font)
	    self.Bind(wx.EVT_BUTTON,self.OnClick,self.button)
	    self.main = main
	elif type == "Item":	#pass parameter type "Item"
	    self.main = main
	    #Select category - combo box
	    self.cbox = wx.ComboBox(self.panel,2, "Select category",(270, 10), 
			    (120,-1),sorted(category.keys()),wx.CB_DROPDOWN)
	    self.cbox.SetFont(self.main.font)
	    self.Bind(wx.EVT_COMBOBOX, self.blah, self.cbox)

	    #Tittle
	    self.staticText = wx.StaticText(self.panel,-1,"Tittle",(10,10),(-1,20))
	    self.staticText.SetFont(main.font)
	    self.TittleText = wx.TextCtrl(self.panel,-1,pos=(50,10),size=(210,20))
	    self.TittleText.SetFont(main.font)
	    
	    #Content
	    self.ContentText = wx.TextCtrl(self.panel,-1,pos=(10,35),size=(380,200),
					    	style=wx.TE_MULTILINE)
	    self.ContentText.SetFont(main.font)
	    
	    #Create Button
	    self.createbutton = wx.Button(self.panel,-1,"Create",pos=(170,240),size=(63,22))
	    self.createbutton.SetFont(self.main.font)
	    self.Bind(wx.EVT_BUTTON,self.OnCreate,self.createbutton)
    
    def blah(self,eve):
        """docstring for blah"""
        pass

    def OnClick(self,event):
        """docstring for OnClick"""
	global category
        new_category = self.categoryText.GetValue()
	if category.get(new_category,None) == None:
	    category[new_category] = None
	    out = open("opps.ini","w")
	    pickle.dump(category,out)
	    out.close()
	    self.main.UpdateList()
	    self.Close()

    def OnCreate(self,event):
        """docstring for OnCreate"""
	global category
	title = self.TittleText.GetValue()
	cate = self.cbox.GetValue()
	content = self.ContentText.GetValue()
	if title == "" or cate == "Select category" or content == "":
	    wx.MessageBox("Some field is empty!sorry!")
	    return
	if category[cate] == None:
	    dict = {}
	    dict["tittle"] = title
	    dict["content"] = content
	    L = []
	    L.append(dict)
	    category[cate] = L
	    out = open("opps.ini","w")
	    pickle.dump(category,out)
	    out.close()
	else:
	    dict = {}
	    dict["tittle"] = title
	    dict["content"] = content
	    category[cate].append(dict)
	    out = open("opps.ini","w")
	    pickle.dump(category,out)
	    out.close()
	self.Close()


class Frame(wx.Frame):
    def __init__(self,id=-1,size=(500,600),style=wx.MINIMIZE_BOX|wx.CAPTION|wx.SYSTEM_MENU|wx.CLOSE_BOX):
        wx.Frame.__init__(self,None,-1,"Get Things Done",(0,0),size=size,style=style)
	self.panel = wx.Panel(self,-1)
	self.SetBackgroundColour(wx.WHITE)
	self.CenterOnScreen()

	#Create a font
	self.font = wx.Font(10,family=wx.DEFAULT,style=wx.NORMAL,weight=wx.NORMAL,faceName="Courier New")

	#Prepare the MenuBar
	menuBar = wx.MenuBar()
	
	#New menu
	new_Menu = wx.Menu()
	new_Menu.Append(101,"&New Category","A text")
	new_Menu.Append(102,"&New Item","A Text")
	new_Menu.Append(103,"E&xit","A text")
	menuBar.Append(new_Menu,"&New ")
	
	#Delete menu
	delete_menu = wx.Menu()

	#List Box
	self.listPos = (3,3)
	self.listRange = (120,227)
	self.listbox = wx.ListBox(self.panel,60,self.listPos,self.listRange,
				    sorted(category.keys()),wx.LB_SINGLE)
	self.listbox.SetFont(self.font)
	self.Bind(wx.EVT_LISTBOX, self.EvtListBox, self.listbox)
	
	#Combo Box
	l = []
	self.cb = wx.ComboBox(self.panel,2, "None Selected",(150, 3), 
			    (160,-1),l,wx.CB_DROPDOWN)
	self.cb.SetFont(self.font)
	self.Bind(wx.EVT_COMBOBOX, self.EvtComboBox, self.cb)
	
	#Tittle TextCtrl
	self.tittle = wx.TextCtrl(self.panel,-1,pos=(150,30),size=(300,20))
	self.tittle.SetFont(self.font)
	
	self.tittleText = wx.StaticText(self.panel,-1,"[ Tittle ]",(460,35),(-1,20))
	self.tittleText.SetFont(self.font)

	#Content TextCtrl
	self.content = wx.TextCtrl(self.panel,-1,pos=(150,55),size=(380,150),
				style=wx.TE_MULTILINE)
	self.content.SetFont(self.font)	
	
	#Delete Item
	self.delitembutton = wx.Button(self.panel,-1,"Delete Item",pos=(312,3),size=(110,23))
	self.delitembutton.SetFont(self.font)
	self.Bind(wx.EVT_BUTTON,self.OnDelItem,self.delitembutton)

	#Delete Category Button
	self.delcatebutton = wx.Button(self.panel,-1,"Delete Category",pos=(422,3),size=(110,23))
	self.delcatebutton.SetFont(self.font)
	self.Bind(wx.EVT_BUTTON,self.OnDel,self.delcatebutton)
    
	#Move to Combo box
	self.mtText = wx.StaticText(self.panel,-1,"Move To",(150,212),(-1,20))
	self.mtText.SetFont(self.font)

	self.mtcb = wx.ComboBox(self.panel,2, "Move To...",(205,208), 
			    (200,-1),sorted(category.keys()),wx.CB_DROPDOWN)
	self.mtcb.SetFont(self.font)
	self.Bind(wx.EVT_COMBOBOX, self.EvtComboBox, self.mtcb)

	#Apply the menubar
	self.SetMenuBar(menuBar)
	
	#Menu Events
	self.Bind(wx.EVT_MENU, self.Menu101, id=101)
	self.Bind(wx.EVT_MENU, self.Menu102, id=102)
	self.Bind(wx.EVT_MENU, self.Menu103, id=103)

    #Methods
    def EvtMoveTo(self,evt):
        """docstring for EvtMoveTo"""
	if self.mtcb != evt.GetEventObject():
	    return
        global category
        destcate = self.mtcb.GetValue()
	
	tittle_to_move = self.cb.GetValue()
	if tittle_to_move == "None Selected":
	    return 

	#first move to
	list = category[destcate]
	if list == None:
	    l = []
	    dict = {}
	    dict["tittle"] = self.tittle.GetValue()
	    dict["content"] = self.content.GetValue()
	    l.append(dict)
	    category[destcate] = l
	else:
	    dict = {}
	    dict["tittle"] = self.tittle.GetValue()
	    dict["content"] = self.content.GetValue()
	    category[destcate].append(dict)
	
	#second delete
	cate = self.listbox.GetStringSelection()
	list = category[cate]
	for dict in xrange(0,len(list)):
	    if list[dict]["tittle"] == tittle_to_move:
		del list[dict]
		out = open("opps.ini","w")
		pickle.dump(category,out)
		out.close()
		break
	self.ClearItemControll()
	
    def OnDelItem(self,evt):
        """docstring for OnDelItem"""
	global category
        tittle_to_delete = self.cb.GetValue()
	if tittle_to_delete == "None Selected":
	    return 
	cate = self.listbox.GetStringSelection()
	list = category[cate]

	for dict in xrange(0,len(list)):
	    if list[dict]["tittle"] == tittle_to_delete:
		del list[dict]
		out = open("opps.ini","w")
		pickle.dump(category,out)
		out.close()
		break
	self.ClearItemControll()
	wx.MessageBox("%s deleted successfully!"%tittle_to_delete)

    def OnDel(self,event):
	global category
	cate = self.listbox.GetStringSelection()
	if cate == "":
	    return
	del category[cate]
	out = open("opps.ini","w")
	pickle.dump(category,out)
	out.close()
	self.UpdateList()
	self.ClearItemControll()
    
    def ClearItemControll(self):
	#Clear Combo Box
	self.cb.Show(False)
	del self.cb
	self.cb = wx.ComboBox(self.panel,2, "None Selected",(150, 3), 
				    (160,-1),[],wx.CB_DROPDOWN)
	self.cb.SetFont(self.font)
	self.Bind(wx.EVT_COMBOBOX, self.EvtComboBox, self.cb)
	#Clear tittle and content controlls
	self.tittle.SetValue("")
	self.content.SetValue("")
	
    def EvtListBox(self,event):
	#clear up Tittle and Content controlls
	self.tittle.SetValue("")
	self.content.SetValue("")
	
	cate = event.GetString()
	list = category[cate]
	l = []
	if list == None or list == []:
	    self.cb.Show(False)
	    del self.cb
	    self.cb = wx.ComboBox(self.panel,2, "None Selected",(150, 3), 
				(160,-1),[],wx.CB_DROPDOWN)
	    self.cb.SetFont(self.font)
	    self.Bind(wx.EVT_COMBOBOX, self.EvtComboBox, self.cb)
	    return 

	for dict in list:
	    l.append(dict["tittle"])
	self.cb.Show(False)
	del self.cb
	self.cb = wx.ComboBox(self.panel,2, "None Selected",(150, 3), 
			    (160,-1),l,wx.CB_DROPDOWN)
	self.cb.SetFont(self.font)
	self.Bind(wx.EVT_COMBOBOX, self.EvtComboBox, self.cb)

    def EvtComboBox(self,event):
        """docstring for EvtComboBox"""
	self.EvtMoveTo(event)
	if self.cb != event.GetEventObject():
	    return
	tittle = event.GetString()
	if tittle == "None Selected":
	    return

	self.tittle.SetValue(tittle)
	cate = self.listbox.GetStringSelection()
	list = category[cate]
	for dict in list:
	    if dict["tittle"] == tittle:
		self.content.SetValue(dict["content"])
		break

    def UpdateList(self):
        """docstring for UpdateList"""
	self.listbox.Show(False)
        del self.listbox
	self.listbox = wx.ListBox(self.panel,60,self.listPos,self.listRange,
				sorted(category.keys()),wx.LB_SINGLE)
	self.listbox.SetFont(self.font)
	self.Bind(wx.EVT_LISTBOX, self.EvtListBox, self.listbox)
	
	self.mtcb.Show(False)
	del self.mtcb
	self.mtcb = wx.ComboBox(self.panel,2, "Move To...",(205,208), 
				 (200,-1),sorted(category.keys()),wx.CB_DROPDOWN)
	self.mtcb.SetFont(self.font)
	self.Bind(wx.EVT_COMBOBOX, self.EvtComboBox, self.mtcb)

    #New Category
    def Menu101(self,event):
        """docstring for Menu101"""
        new = NewFrame(size=(310,90),main=self)
	new.Show()
    #New Item
    def Menu102(self,event):
        """docstring for Menu102"""
	new = NewFrame(size=(400,300),main=self,type="Item")
	new.Show()
    #Exit Programe
    def Menu103(self,event):
        """docstring for Menu103"""
        self.Close()

class OwnApp(wx.App):
    def OnInit(self):
	global category
        #Read configuration from oops.ini file
	try:
	    infile = open("opps.ini","r")
	except IOError:
	    wx.MessageBox("IOError!")
	else:
	    category = pickle.load(infile)
	    infile.close()
	frame = Frame(size=(600,290))
	frame.Show()
	return True

if __name__ == '__main__':
    app = OwnApp()
    app.MainLoop()
  • 大小: 45.3 KB
分享到:
评论
2 楼 ph4nut 2010-05-18  
pipal 写道
挺不错的。以前用Java也实现过类似功能,现在不碰Java好多年……

Java我懂得很少,我自己学习C++
1 楼 pipal 2010-02-21  
挺不错的。以前用Java也实现过类似功能,现在不碰Java好多年……

相关推荐

    google-api-services-gmail-v1-rev6-1.19.0.zip

    【标题】"google-api-services-gmail-v1-rev6-1.19.0.zip" 是一个包含Google Gmail API服务的Java库,该库版本为v1,修订版为rev6,版本号为1.19.0。Gmail API是Google提供的一个接口,允许开发者通过编程方式与...

    Laravel开发-laravel-gmail

    在"laravel-gmail-master"这个压缩包中,你应该能找到项目的源码,包括控制器、服务提供者、模型和其他必要的组件,供你学习和参考。通过深入研究这些文件,你可以更好地理解如何利用Laravel和Gmail API来构建自己的...

    make-your-own-gmail, 使用 Google JavaScript SDK AngularJS的Gmail副本示例.zip

    make-your-own-gmail, 使用 Google JavaScript SDK AngularJS的Gmail副本示例 制作你自己的Gmail.com可以定制的,独立的Gmail帐户接口。 这是一个可以编辑的脚手架,用于构建你自己的界面以与你的Gmail电子邮件帐户...

    电商项目-gmail-parent-0621.zip

    标题 "电商项目-gmail-parent-0621.zip" 暗示这是一个与电商相关的项目,其中包含了 Gmail 的某种父级模块。这个压缩包可能是为了组织和分发项目代码而创建的,它可能包含了多个子模块或者服务,而 "gmail-parent-...

    邮件导入工具import-mailbox-to-gmail.zip

    import-mailbox-to-gmail 是 Gmail 的邮件导入工具,可以把 .mbox 文件导入到 to Google Apps for Work。声明:这不是官方 Google 产品。如果你想从 Mozilla Thunderbird 迁移到 Gmail,可以尝试 mail-importer。 ...

    hubot-gmail-notify:hubot-gmail-notify

    hubot-gmail-notify 带有Hubot的 Oauth2授权。 在本地运行hubot-gmail-notify 您可以通过运行以下命令测试您的Hubot。 您可以通过运行以下命令在本地启动hubot-gmail-notify: export HUBOT_GOOGLE_CLIENT_ID=...

    前端项目-gmail-js.zip

    【标题】"前端项目-gmail-js.zip"是一个前端开发项目,专注于使用JavaScript与Gmail的API进行交互。这个项目特别适合那些想要构建Chrome扩展或增强Gmail功能的开发者。 【描述】提到的“gmail的javascript API”,...

    Github通知邮件github-gmail.zip

    github-gmail 是一个 Chromme 和 Firefox 浏览器扩展,它能在你的 Gmail 邮箱上添加一个 Github 通知邮件的快捷方式。 标签:github

    selenium-python-gmail:gmail 测试

    Selenium-Python-gmail 使用 python 和 selenium 进行简单的 Gmail 测试如何开始: 安装python 2.7 安装虚拟环境安装点安装Selenium安装pytest 为项目创建目录并在那里克隆这个项目: git 克隆如何从 PyCharm (IDE) ...

    elasticsearch-gmail, 使用Elasticsearch索引你的Gmail收件箱.zip

    elasticsearch-gmail, 使用Elasticsearch索引你的Gmail收件箱 面向初学者的 Elasticsearch: 索引你的Gmail收件箱 这是什么?I I,I,space,space,emails,emails,emails,emails,emails,emails,emails,emails...

    python-gmail:Python-gmail

    Python-gmail是一个Python库,专为处理Gmail服务而设计,允许用户通过Python代码发送和检索电子邮件。这个库是基于Google的Gmail API构建的,提供了简单易用的接口,使得开发者可以方便地进行邮件的读取、撰写、发送...

    Laravel开发-gmail-api-easy

    完成这些步骤后,我们就可以在`GmailController`中使用这些方法来与Gmail API进行交互。 Gmail API提供了丰富的功能,包括邮件的读取、发送、删除等。我们可以创建一系列的方法,如`fetchMails()`, `sendMail()`, `...

    elixir-gmail:Elixir的Gmail API客户端

    通过Gmail API,开发者可以创建自定义邮件应用、邮件同步工具或者自动化工作流。 **3. Elixir-Gmail库的功能** - **授权和身份验证**:`elixir-gmail` 提供了OAuth2身份验证机制,使得应用可以安全地代表用户访问其...

    laravel-gmail:用于Gmail API的Laravel包装器

    Laravel Gmail 邮箱 适用于Laravel 8的Gmail API 您需要在创建一个应用程序。 指导。 如果需要Laravel 5兼容性,请使用2.0.x版本。 如果您需要Laravel 6兼容性,请使用3.0.x版本。 如果你需要Laravel 7的兼容性,...

    persona-gmail-bridge:为 Gmail 构建最小身份桥的实验

    入门跑步很简单: git clone https://github.com/mozilla/persona-gmail-bridge.git cd persona-gmail-bridge npm install npm start 对于本地开发,请在启动 Persona 之前为 gmail.com 和 googlemail.com 设置...

    安卓开发-Gmail备份手机短信【源码】.zip.zip

    Gson或Jackson库可以方便地完成这一过程。 6. **网络编程**:使用HttpURLConnection或者OkHttp进行网络请求,将短信数据发送到Gmail服务器。理解HTTP协议和网络请求的生命周期是必不可少的。 7. **异步处理**:...

    yii2-google-gmail:与官方Google API客户端一起使用时的GMail助手

    yii2-google-gmail 适用于官方GMail Api v1的数据提供程序,小部件和帮助程序。 安装 安装此扩展的首选方法是通过 。 无论运行 php composer.phar require --prefer-dist machour/yii2-google-gmail "*" 或添加 ...

    node-gmail-watcher:这是使用 IMAP 监控 gmail 邮箱

    《使用Node.js构建Gmail邮箱监控器:深入解析node-gmail-watcher》 在现代的Web开发中,实时数据同步和处理已经成为一个重要的需求。针对这一需求,开发者们经常需要实时监控邮件收件箱,例如Gmail,以便在新邮件...

Global site tag (gtag.js) - Google Analytics