设为首页 收藏本站
查看: 1100|回复: 0

[经验分享] 使用python的wxpython仿写window自带的记事本

[复制链接]

尚未签到

发表于 2017-5-8 10:58:02 | 显示全部楼层 |阅读模式
# -*- coding: utf-8 -*-
import hashlib
import os
import wx
#编辑器主类
"""
记录:menu:Menu
Dialog: MessageDialog,MultiChoiceDialog,NumberEntryDialog,PasswordEntryDialog,PrintDialog,ProgressDialog,SingleChoiceDialog,TextEntryDialog,
FileDialog,FindReplaceDialog,FontDialog
StaticText
设置style=wx.TE_PASSWORD,可以让wx.TextCtrl变成密码输入框。
设置style=wx.TE_READONLY,可以让wx.TextCtrl变成只读输入框。
如果文字过长,wx.TE_DONTWRAP设置强制不换行,wx.TE_LINEWRAP以字符为界断行,wx.TE_WORDWRAP以单词为界断行。
wx.TextCtrl可以响应wx.EVT_TEXT事件,当输入的内容有变化时即可触发此事件。无论是用户输入引起的变化,还是通过setValue()引起的变化都会触发

在wxPython中加速器是一个更加典型的键盘快捷方式,它意味能够随时调用的按键组合,这些按键组合直接触发菜单项。加速器可以用两种方法创建。最简单的方法是,在菜单或菜单项的显示文本中包括加速器按键组合(当菜单或菜单项被添加到其父中时)。实现的方法是,在你的菜单项的文本后放置一个\t。在\t之后定义组合键。组合键的第一部分是一个或多个Alt, Ctrl, 或Shift,由一个+或一个-分隔,随后是实际的加速器按键。例如:New\tctrl-n, SaveAs\tctrl-shift-s。即使在第一部分你只有一个专用的键,你仍可使用+或-来将该部分与实际的按键分隔。这不区分按键组合的大小写。
实际的键可以是任何数字、字母或功能键(如F1~F12),还有表10.6所列出的专用词。
wxPython的方法在通过名字查找一个菜单或菜单项时忽略助记符和加速器。换句话说,对menubar.FindMenuItem("File", "SaveAs")的调用将仍匹配Save as菜单项,即使菜单项的显示名是以Save \tctrl-shift-s形式输入的。
加速器也可能使用加速器表被直接创建,加速器表是类wx.AccleratorTable的一个实例。一个加速器表由wx.AccelratorEntry对象的一个列表组成。wx.AcceleratorTable的构造函数要求一个加速器项的列表,或不带参数。在例10.6中,我们利用了wxPython将隐式使用参数(wx.ACCEL_CTRL, od('Q'),exit.GetId())调用wx.AcceleratorEntry构造函数的事实。wx.AcceleratorEntry的构造函数如下:
wx.AcceleratorEntry(flags, keyCode, cmd)
flags参数是一个使用了一个或多个下列常量的位掩码:wx.ACCEL_ALT, wx.ACCEL_CTRL, wxACCEL_NORMAL , 或wx.ACCEL_SHIFT。该参数表明哪个控制键需要被按下来触发该加速器。keyCode参数代表按下来触发加速器的常规键,它是对应于一个字符的ASCII数字,或在wxWidgets文本中的Keycodes下的一个专用字符。cmd参数是菜单项的wxPython标识符,该菜单项当加速器被调用时触发其命令事件。正如你从例10.6所能看到的,使用这种方法声明一个加速器,不会在这个带菜单项显示名的菜单上列出组合键。你仍需要单独实现它。
"""
'''
@Author xiaoshuang
@Date 2012-05-10
@Version 0.1
'''
class NotBookMainFrame(wx.Frame):
def __init__(self,parent,title):
wx.Frame.__init__(self,parent,title=title)
self.tb = self.CreateToolBar()
self.control = wx.TextCtrl(self,style=wx.TE_MULTILINE|wx.TE_LINEWRAP,size=(300,500))
#Alt
#self.control.Bind(wx.EVT_CHAR, self.OnKeyDown)
# 创建一个状态bar,在window的最下端
self.sbar = self.CreateStatusBar()
# 创建菜单栏
menuB  = self.createMenuBar()
# set menuBar of app
self.SetMenuBar(menuB)
#Ctrl
acceltbl = wx.AcceleratorTable([(wx.ACCEL_CTRL, ord('Q'), self.selectA.GetId())])
self.SetAcceleratorTable(acceltbl)
#frame show
self.Show(True)
def createMenuBar(self):
#Menu
#Append(self, id, text, help, kind)
fileM = wx.Menu()
newF = fileM.Append(wx.NewId(),"新建(N)\tCtrl+N","打开一个已存在的文件.")
fmitem = fileM.Append(wx.NewId(),"打开(O)\tCtrl+O","打开一个已存在的文件.")
save = fileM.Append(wx.NewId(),  "保存(S)\tCtrl+S","保存当前的文件.")
toSave = fileM.Append(wx.NewId(),"另存为(A)..","保存当前的文件.")
fileM.AppendSeparator()
fileM.Append(wx.NewId(),"页面设置(U)..","设置页面格式.")
printL = fileM.Append(wx.NewId(),"打印(P)\tCtrl+P","打印页面.")
fileM.AppendSeparator()
qit = fileM.Append(wx.NewId(),"退出(X)","关闭所有打开的文件.")
#Bind(self,id,event function,obj)
self.Bind(wx.EVT_MENU, self.OnNewFile, newF)
self.Bind(wx.EVT_MENU, self.OnOpen, fmitem)
self.Bind(wx.EVT_MENU, self.OnSave, save)
self.Bind(wx.EVT_MENU, self.OnQuit, qit)

#编辑
editM = wx.Menu()
editM.Append(wx.NewId(),"撤消(U)\tCtrl+Z","撤销最后的操作.")
editM.AppendSeparator()
editM.Append(wx.NewId(),"剪切(U)\tCtrl+X","剪切.")
editM.Append(wx.NewId(),"复制(T)\tCtrl+C","复制.")
editM.Append(wx.NewId(),"粘贴(C)\tCtrl+V","粘贴.")
editM.Append(wx.NewId(),"删除(P)\tDel","删除.")
editM.AppendSeparator()
editM.Append(wx.NewId(),"查找(F)\tCtrl+F","查找.")
editM.Append(wx.NewId(),"查找下一个(N)\tF3","查找下一个.")
editM.Append(wx.NewId(),"删除(P)\tDel","删除.")
editM.Append(wx.NewId(),"替换(R)\tCtrl+H","替换.")
editM.Append(wx.NewId(),"转到(G)\tCtrl+G","转到.")
editM.AppendSeparator()
self.selectA = editM.Append(wx.NewId(),"全选(A)\tCtrl+A","全选.")
self.Bind(wx.EVT_MENU, self.OnSelectAll, self.selectA)
editM.Append(wx.NewId(),"时间/日期(D)\tF5","时间.")
#格式[O]
posM = wx.Menu()
self.autoCutoverLine = self.newline = posM.Append(wx.NewId(),"自动换行(W)","自动换行.",kind=wx.ITEM_CHECK)
self.Bind(wx.EVT_MENU, self.autoCutoverL, self.autoCutoverLine)
self.showToolStatus = 0;
posM.Append(wx.NewId(),"字体(F)..","设置字体.")
#查看[V]
viewM = wx.Menu()
viewM.Append(wx.NewId(),"状态栏","状态栏.")
self.tool=viewM.Append(wx.NewId(),"工具栏","工具栏",kind=wx.ITEM_CHECK)
self.Bind(wx.EVT_MENU, self.ToggleToolBar, self.tool)
#帮助[H]
helpM = wx.Menu()
helpM.Append(wx.NewId(),"查看帮助(H)","查看帮助.")
about = helpM.Append(wx.NewId(),"关于记事本(A)","关于记事本.")
self.Bind(wx.EVT_MENU, self.OnAbout, about)
#create a menuBar
menuB = wx.MenuBar()
# append a menu
menuB.Append(fileM,"文件(F)")
menuB.Append(editM,"编辑(E)")
menuB.Append(posM,"格式[O]")
menuB.Append(viewM,"查看[V]")
menuB.Append(helpM,"帮助[H]")
return menuB
def autoCutoverL(self,event):
print "hell"
#设置字体颜色
#self.control.SetForegroundColour("#F0FFF0")
self.control.SetStyle(-1,-1,wx.TextAttr("wx.TE_WORDWRAP"))
def OnSelectAll(self,event):
self.control.SelectAll()
def OnKeyDown(self,event):
#按键时相应代码
# Alt + F
key = event.GetKeyCode();
if key == ord('f'):
self.fileM.Show()
else:
self.control.AppendText(chr(key))
#是否显示工具栏
def ToggleToolBar(self,event):
self.showToolStatus+=1;
#if self.newline.IsChecked():
if self.showToolStatus % 2 == 1:
print 1111
self.control.SetInsertionPoint(50)
self.tb.Show()
else:
print 2222
self.tb.Hide()

#新建文件
def OnNewFile(self,event):
if self.control.IsEmpty() <> True:
dlg = wx.MessageDialog(self, "是否将更改保存到无标题?","记事本",wx.YES_NO | wx.ICON_QUESTION | wx.CANCEL)
retCode = dlg.ShowModal()
if retCode == wx.ID_YES:
# 保存
self.OnSave(event)
# 保存完后,创建新文件
self.control.SetValue("")
elif retCode == wx.ID_NO:
# 清空
self.control.SetValue("")
else:
# 取消
dlg.Close();
dlg.Destroy()
#保存
def OnSave(self,event):
#判断是否有内容
if self.control.IsEmpty():
return;
self.dirname=''
""" wx.FD_OPEN   
wx.FD_SAVE   
wx.FD_OVERWRITE_PROMPT
wx.FD_MULTIPLE   
wx.FD_CHANGE_DIR """
dlg = wx.FileDialog(self,"choose a file",self.dirname,"","*.*",wx.FD_SAVE)
if dlg.ShowModal() == wx.ID_OK:
self.filename = dlg.GetFilename()
self.dirname = dlg.GetDirectory()
f = open(os.path.join(self.dirname, self.filename), 'w')
f.write(self.control.GetValue());
f.close()
dlg.Destroy()
# 重新设置记事本的Title
self.Title  = self.filename + " - 记事本"
#打开选择文件的dialog
def OnOpen(self,event):
print self.control.GetValue()
self.dirname=''
self.dirname=''
""" wx.FD_OPEN   
wx.FD_SAVE   
wx.FD_OVERWRITE_PROMPT
wx.FD_MULTIPLE   
wx.FD_CHANGE_DIR """
dlg = wx.FileDialog(self,"choose a file",self.dirname,"","*.*",wx.OPEN)
if dlg.ShowModal() == wx.ID_OK:
self.filename = dlg.GetFilename()
self.dirname = dlg.GetDirectory()
f = open(os.path.join(self.dirname, self.filename), 'r')
self.control.SetValue(f.read())
f.close()
dlg.Destroy()
self.control.SetFocus()
wx.StaticText(self.sbar, label=self.filename + ","+ str(self.control.GetNumberOfLines()) + " 行",pos=(0,1))
# 退出   
def OnQuit(self,event):
self.Close()
# 关于   
def OnAbout(self,event):
dlg = wx.MessageDialog(self, "hello,baby","title is a baby",wx.OK)
dlg.ShowModal()
self.control.SelectAll();
dlg.Destroy()
def OnHello(self, event):
pass     
#创建按钮
def createButtonBar(self, panel, yPos = 10):
xPos = 0
for eachLabel, eachHandler in self.buttonData():
pos = (xPos, yPos)
button = self.buildOneButton(panel, eachLabel,eachHandler, pos)
xPos += button.GetSize().width
def buildOneButton(self, parent, label, handler, pos=(0,0)):
button = wx.Button(parent, -1, label, pos)
self.Bind(wx.EVT_BUTTON, handler, button)
return button
#get md5
@staticmethod
def GetMd5(content):
#md5 = hashlib.md5() #创建一个MD5加密对象
#md5.update(content)  #更新要加密的数据
#return md5.digest();  #加密后的结果(二进制)
#print md5.hexdigest() #加密后的结果,用十六进制字符串表示。
return hashlib.new("md5", content).hexdigest()
if __name__=="__main__":
app = wx.App(False)
frame = NotBookMainFrame(None,"无标题 - 记事本")
app.MainLoop()


DSC0000.jpg
图例2
DSC0001.jpg

记事本刚刚开始,也只是实现了很少的功能,从中遇到了不少问题。
如果你没事也想学着玩,那咱可以一起来完成功能。共同切磋。一块提高。
如果你有更好,更有意义的桌面应用需要wxpython来写,那我也希望能参与参与。
参考文档:
wxpython的api:http://www.wxpython.org/docs/api/   
活学活用wxPython:http://www.czug.org/python/wxpythoninaction/
接下来空闲的时候想再写个仿CRT远程连接的工具。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-374596-1-1.html 上篇帖子: Python:监控键盘输入、鼠标操作,并将捕获到的信息记录到文件中 下篇帖子: 简单的相亲推荐应用——Python以及机器学习中K-邻近算法的应用
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表