- 浏览: 5793 次
- 性别:
- 来自: 深圳
最近访客 更多访客>>
最新评论
-
ph4nut:
<div class="quote_title ...
wxGDT - [Gmail同步未完成] -
pipal:
挺不错的。以前用Java也实现过类似功能,现在不碰Java好多 ...
wxGDT - [Gmail同步未完成]
wxGDT是我为自己写的一个简便的GDT工具,平时都用Gmail来做GDT管理。考虑到应该有个离线的GDT工具,而且也未找到适合自己风格的替代品,于是写了一个。功能欠缺Gmail同步模块,待增加!
数据保存:用pickle module保存于同目录文件下.
截图:
代码:
Java我懂得很少,我自己学习C++
数据保存:用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()
评论
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 Gmail API服务的Java库,该库版本为v1,修订版为rev6,版本号为1.19.0。Gmail API是Google提供的一个接口,允许开发者通过编程方式与...
在"laravel-gmail-master"这个压缩包中,你应该能找到项目的源码,包括控制器、服务提供者、模型和其他必要的组件,供你学习和参考。通过深入研究这些文件,你可以更好地理解如何利用Laravel和Gmail API来构建自己的...
make-your-own-gmail, 使用 Google JavaScript SDK AngularJS的Gmail副本示例 制作你自己的Gmail.com可以定制的,独立的Gmail帐户接口。 这是一个可以编辑的脚手架,用于构建你自己的界面以与你的Gmail电子邮件帐户...
标题 "电商项目-gmail-parent-0621.zip" 暗示这是一个与电商相关的项目,其中包含了 Gmail 的某种父级模块。这个压缩包可能是为了组织和分发项目代码而创建的,它可能包含了多个子模块或者服务,而 "gmail-parent-...
import-mailbox-to-gmail 是 Gmail 的邮件导入工具,可以把 .mbox 文件导入到 to Google Apps for Work。声明:这不是官方 Google 产品。如果你想从 Mozilla Thunderbird 迁移到 Gmail,可以尝试 mail-importer。 ...
hubot-gmail-notify 带有Hubot的 Oauth2授权。 在本地运行hubot-gmail-notify 您可以通过运行以下命令测试您的Hubot。 您可以通过运行以下命令在本地启动hubot-gmail-notify: export HUBOT_GOOGLE_CLIENT_ID=...
【标题】"前端项目-gmail-js.zip"是一个前端开发项目,专注于使用JavaScript与Gmail的API进行交互。这个项目特别适合那些想要构建Chrome扩展或增强Gmail功能的开发者。 【描述】提到的“gmail的javascript API”,...
github-gmail 是一个 Chromme 和 Firefox 浏览器扩展,它能在你的 Gmail 邮箱上添加一个 Github 通知邮件的快捷方式。 标签:github
Selenium-Python-gmail 使用 python 和 selenium 进行简单的 Gmail 测试如何开始: 安装python 2.7 安装虚拟环境安装点安装Selenium安装pytest 为项目创建目录并在那里克隆这个项目: git 克隆如何从 PyCharm (IDE) ...
elasticsearch-gmail, 使用Elasticsearch索引你的Gmail收件箱 面向初学者的 Elasticsearch: 索引你的Gmail收件箱 这是什么?I I,I,space,space,emails,emails,emails,emails,emails,emails,emails,emails...
Python-gmail是一个Python库,专为处理Gmail服务而设计,允许用户通过Python代码发送和检索电子邮件。这个库是基于Google的Gmail API构建的,提供了简单易用的接口,使得开发者可以方便地进行邮件的读取、撰写、发送...
完成这些步骤后,我们就可以在`GmailController`中使用这些方法来与Gmail API进行交互。 Gmail API提供了丰富的功能,包括邮件的读取、发送、删除等。我们可以创建一系列的方法,如`fetchMails()`, `sendMail()`, `...
通过Gmail API,开发者可以创建自定义邮件应用、邮件同步工具或者自动化工作流。 **3. Elixir-Gmail库的功能** - **授权和身份验证**:`elixir-gmail` 提供了OAuth2身份验证机制,使得应用可以安全地代表用户访问其...
Laravel Gmail 邮箱 适用于Laravel 8的Gmail API 您需要在创建一个应用程序。 指导。 如果需要Laravel 5兼容性,请使用2.0.x版本。 如果您需要Laravel 6兼容性,请使用3.0.x版本。 如果你需要Laravel 7的兼容性,...
入门跑步很简单: git clone https://github.com/mozilla/persona-gmail-bridge.git cd persona-gmail-bridge npm install npm start 对于本地开发,请在启动 Persona 之前为 gmail.com 和 googlemail.com 设置...
Gson或Jackson库可以方便地完成这一过程。 6. **网络编程**:使用HttpURLConnection或者OkHttp进行网络请求,将短信数据发送到Gmail服务器。理解HTTP协议和网络请求的生命周期是必不可少的。 7. **异步处理**:...
yii2-google-gmail 适用于官方GMail Api v1的数据提供程序,小部件和帮助程序。 安装 安装此扩展的首选方法是通过 。 无论运行 php composer.phar require --prefer-dist machour/yii2-google-gmail "*" 或添加 ...
《使用Node.js构建Gmail邮箱监控器:深入解析node-gmail-watcher》 在现代的Web开发中,实时数据同步和处理已经成为一个重要的需求。针对这一需求,开发者们经常需要实时监控邮件收件箱,例如Gmail,以便在新邮件...