chang all

This commit is contained in:
XiongNeng
2015-05-07 12:02:58 +08:00
parent eb87290127
commit 76b4ddc829
73 changed files with 80 additions and 278460 deletions

177
Makefile
View File

@@ -1,177 +0,0 @@
# Makefile for Sphinx documentation
#
# You can set these variables from the command line.
SPHINXOPTS =
SPHINXBUILD = sphinx-build
PAPER =
BUILDDIR = build
# User-friendly check for sphinx-build
ifeq ($(shell which $(SPHINXBUILD) >/dev/null 2>&1; echo $$?), 1)
$(error The '$(SPHINXBUILD)' command was not found. Make sure you have Sphinx installed, then set the SPHINXBUILD environment variable to point to the full path of the '$(SPHINXBUILD)' executable. Alternatively you can add the directory with the executable to your PATH. If you don't have Sphinx installed, grab it from http://sphinx-doc.org/)
endif
# Internal variables.
PAPEROPT_a4 = -D latex_paper_size=a4
PAPEROPT_letter = -D latex_paper_size=letter
ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source
# the i18n builder cannot share the environment and doctrees with the others
I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source
.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext
help:
@echo "Please use \`make <target>' where <target> is one of"
@echo " html to make standalone HTML files"
@echo " dirhtml to make HTML files named index.html in directories"
@echo " singlehtml to make a single large HTML file"
@echo " pickle to make pickle files"
@echo " json to make JSON files"
@echo " htmlhelp to make HTML files and a HTML help project"
@echo " qthelp to make HTML files and a qthelp project"
@echo " devhelp to make HTML files and a Devhelp project"
@echo " epub to make an epub"
@echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
@echo " latexpdf to make LaTeX files and run them through pdflatex"
@echo " latexpdfja to make LaTeX files and run them through platex/dvipdfmx"
@echo " text to make text files"
@echo " man to make manual pages"
@echo " texinfo to make Texinfo files"
@echo " info to make Texinfo files and run them through makeinfo"
@echo " gettext to make PO message catalogs"
@echo " changes to make an overview of all changed/added/deprecated items"
@echo " xml to make Docutils-native XML files"
@echo " pseudoxml to make pseudoxml-XML files for display purposes"
@echo " linkcheck to check all external links for integrity"
@echo " doctest to run all doctests embedded in the documentation (if enabled)"
clean:
rm -rf $(BUILDDIR)/*
html:
$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
@echo
@echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
dirhtml:
$(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml
@echo
@echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml."
singlehtml:
$(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml
@echo
@echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml."
pickle:
$(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle
@echo
@echo "Build finished; now you can process the pickle files."
json:
$(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json
@echo
@echo "Build finished; now you can process the JSON files."
htmlhelp:
$(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp
@echo
@echo "Build finished; now you can run HTML Help Workshop with the" \
".hhp project file in $(BUILDDIR)/htmlhelp."
qthelp:
$(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp
@echo
@echo "Build finished; now you can run "qcollectiongenerator" with the" \
".qhcp project file in $(BUILDDIR)/qthelp, like this:"
@echo "# qcollectiongenerator $(BUILDDIR)/qthelp/python3-cookbook.qhcp"
@echo "To view the help file:"
@echo "# assistant -collectionFile $(BUILDDIR)/qthelp/python3-cookbook.qhc"
devhelp:
$(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp
@echo
@echo "Build finished."
@echo "To view the help file:"
@echo "# mkdir -p $$HOME/.local/share/devhelp/python3-cookbook"
@echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/python3-cookbook"
@echo "# devhelp"
epub:
$(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub
@echo
@echo "Build finished. The epub file is in $(BUILDDIR)/epub."
latex:
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
@echo
@echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex."
@echo "Run \`make' in that directory to run these through (pdf)latex" \
"(use \`make latexpdf' here to do that automatically)."
latexpdf:
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
@echo "Running LaTeX files through pdflatex..."
$(MAKE) -C $(BUILDDIR)/latex all-pdf
@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
latexpdfja:
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
@echo "Running LaTeX files through platex and dvipdfmx..."
$(MAKE) -C $(BUILDDIR)/latex all-pdf-ja
@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
text:
$(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text
@echo
@echo "Build finished. The text files are in $(BUILDDIR)/text."
man:
$(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man
@echo
@echo "Build finished. The manual pages are in $(BUILDDIR)/man."
texinfo:
$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
@echo
@echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo."
@echo "Run \`make' in that directory to run these through makeinfo" \
"(use \`make info' here to do that automatically)."
info:
$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
@echo "Running Texinfo files through makeinfo..."
make -C $(BUILDDIR)/texinfo info
@echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo."
gettext:
$(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale
@echo
@echo "Build finished. The message catalogs are in $(BUILDDIR)/locale."
changes:
$(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes
@echo
@echo "The overview file is in $(BUILDDIR)/changes."
linkcheck:
$(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck
@echo
@echo "Link check complete; look for any errors in the above output " \
"or in $(BUILDDIR)/linkcheck/output.txt."
doctest:
$(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest
@echo "Testing of doctests in the sources finished, look at the " \
"results in $(BUILDDIR)/doctest/output.txt."
xml:
$(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml
@echo
@echo "Build finished. The XML files are in $(BUILDDIR)/xml."
pseudoxml:
$(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml
@echo
@echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml."

View File

@@ -4,6 +4,16 @@
Topic: sample Topic: sample
Desc : Desc :
""" """
import re
import os
from os.path import join
import logging
logging.basicConfig(level=logging.INFO,
format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
datefmt='%Y-%m-%d %H:%M:%S',
handlers=[logging.FileHandler('d:/logs/cookbook.log', 'w', 'utf-8')])
_log = logging.getLogger('app.' + __name__)
def read_demo(): def read_demo():
@@ -15,5 +25,54 @@ def read_demo():
pass pass
def read_plus(txt_file, init_c, base_dir):
"""演示一下seek方法"""
chapter = init_c - 1 # 章
paper = 0 # 节
write_file = None # 接下来要写入的文件
temp_lines = [] # 临时存放章或节内容
with open(txt_file, mode='r', encoding='utf-8') as f:
for line in f:
if re.match('^CHAPTER \d+$', line.strip()):
chapter += 1
# 开始新的一章了
_log.info('开始新的一章了,第{}章!'.format(chapter))
# 前面的给写入文件中
if temp_lines:
with open(write_file, mode='w', encoding='utf-8') as wf:
wf.writelines(temp_lines)
temp_lines.clear()
# 首先创建一个章节源码目录
c_dir = join(base_dir, 'cookbook', 'c{:02d}'.format(chapter))
if not os.path.exists(c_dir):
os.makedirs(c_dir)
# 找到章节文件
chapters_dir = join(c_dir, 'source', 'chapters')
onlyfiles = [join(chapters_dir, f) for f in os.listdir(chapters_dir)
if os.path.isfile(join(chapters_dir, f))]
write_file = next(f for f in onlyfiles if f.startswith('p{:02d}'.format(chapter)))
elif re.match('^{}.{}. '.format(chapter, paper + 1), line.strip()):
f.seek(1, 1) # 往前进一行
if f.readline().strip() == 'Problem':
# 说明是新的一节开始了
paper += 1
f.seek(-1, 1) # 退一行
_log.info('开始新的一节了,第{}章,第{}节!'.format(chapter, paper))
# 前面的给写入文件中
if temp_lines:
with open(write_file, mode='w', encoding='utf-8') as wf:
wf.writelines(temp_lines)
temp_lines.clear()
# 定义接下来要写入的节文件
paper_dir = join(base_dir, 'source', 'c{:02d}'.format(chapter))
pfs = [join(paper_dir, f) for f in os.listdir(paper_dir)
if os.path.isfile(join(paper_dir, f))]
write_file = next(f for f in pfs if f.startswith('p{:02d}'.format(chapter)))
else:
f.seek(-1, 1)
else:
temp_lines.append(line)
if __name__ == '__main__': if __name__ == '__main__':
read_demo() print('{:02d}'.format(11))

View File

@@ -1,7 +0,0 @@
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
"""
Topic: sample
Desc : 这个是我自己的实用代码集锦
"""
__author__ = 'Xiong Neng'

View File

@@ -1,7 +1,7 @@
#!/usr/bin/env python #!/usr/bin/env python
# -*- encoding: utf-8 -*- # -*- encoding: utf-8 -*-
""" """
Topic: sample Topic: 实用代码集锦
Desc : Desc :
""" """

View File

@@ -4,8 +4,11 @@
Topic: sample Topic: sample
Desc : Desc :
""" """
import sys, os import sys
from . import consttype as const import os
from basic.samples import consttype as const
__author__ = 'Xiong Neng' __author__ = 'Xiong Neng'
const.ROOT_PATH = os.path.dirname(sys.path[0]) const.ROOT_PATH = os.path.dirname(sys.path[0])

View File

@@ -222,7 +222,7 @@ def xlsx_to_table(xlsx_name):
if __name__ == '__main__': if __name__ == '__main__':
excel = r'D:\download\20150505\gdc2.xlsx' excel = r'D:\download\20150505\gdc.xlsx'
_init_table() _init_table()
conn = _connect() conn = _connect()
xlsx_to_table(excel) xlsx_to_table(excel)

View File

@@ -6,18 +6,19 @@ Desc : 最后的结果是我想要的,去除了页头和页脚的部分
""" """
import re import re
def beauty(txt_file): def beauty(txt_file):
with open(txt_file, mode='r+', encoding='utf-8') as f: with open(txt_file, mode='r+', encoding='utf-8') as f:
lines = f.readlines() lines = f.readlines()
f.seek(0) f.seek(0)
for line in lines: for line in lines:
if line.startswith('www.it-ebooks.info'): if line.startswith('www.it-ebooks.info'):
f.seek(f.tell() - 1) f.seek(f.tell() - 1, 1)
if f.readline().startswith('Chapter '): if f.readline().startswith('Chapter '):
# 回退7位 # 回退7位
f.seek(f.tell() - 7) f.seek(f.tell() - 7, 1)
else: else:
f.seek(f.tell() - 5) f.seek(f.tell() - 5, 1)
else: else:
f.write(line) f.write(line)
f.truncate() f.truncate()
@@ -47,5 +48,13 @@ def beauty2(pre_txt, after_txt):
f.writelines(result_lines) f.writelines(result_lines)
def generate_chapter():
"""
解析文本文件生成最终的待翻译文件
"""
if __name__ == '__main__': if __name__ == '__main__':
beauty2('pc_pre.txt', 'pc_after') # beauty2('pc_pre.txt', 'pc_after')
pass

View File

View File

@@ -1,13 +0,0 @@
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title>
</head>
<body>
<h1>dddddddddd</h1>
<p style="text-align: right; margin-top: 200px;">
RRRRRRRRRR
</p>
</body>
</html>

View File

@@ -1,6 +0,0 @@
# -*- coding: utf-8 -*-
def setup(app):
import sphinx.search as search
import zh
search.languages["zh_CN"] = zh.SearchChinese

275916
exts/main.dic

File diff suppressed because it is too large Load Diff

View File

@@ -1,144 +0,0 @@
# -*- coding: utf-8 -*-
import re
import os
import sys
class SEG(object):
def __init__(self):
_localDir=os.path.dirname(__file__)
_curpath=os.path.normpath(os.path.join(os.getcwd(),_localDir))
curpath=_curpath
self.d = {}
print >> sys.stderr,"loading dict..."
self.set([x.rstrip() for x in file(os.path.join(curpath,"main.dic")) ])
self.specialwords= set([x.rstrip().decode('utf-8') for x in file(os.path.join(curpath,"suffix.dic"))])
print >> sys.stderr,'dict ok.'
#set dictionary(a list)
def set(self,keywords):
p = self.d
q = {}
k = ''
for word in keywords:
word = (chr(11)+word).decode('utf-8')
if len(word)>5:
continue
p = self.d
ln = len(word)
for i in xrange(ln-1,-1,-1):
char = word[i].lower()
if p=='':
q[k] = {}
p = q[k]
if not (char in p):
p[char] = ''
q = p
k = char
p = p[char]
pass
def _binary_seg(self,s):
ln = len(s)
if ln==1:
return [s]
R = []
for i in xrange(ln,1,-1):
tmp = s[i-2:i]
R.append(tmp)
return R
def _pro_unreg(self,piece):
#print piece
R = []
tmp = re.sub(u"。||,||…|!|《|》|<|>|\"|'|:|||\?|、|\||“|”||||—|||·|\(|\)| "," ",piece).split()
ln1 = len(tmp)
for i in xrange(len(tmp)-1,-1,-1):
mc = re.split(r"([0-9A-Za-z\-\+#@_\.]+)",tmp[i])
for j in xrange(len(mc)-1,-1,-1):
r = mc[j]
if re.search(r"([0-9A-Za-z\-\+#@_\.]+)",r)!=None:
R.append(r)
else:
R.extend(self._binary_seg(r))
return R
def cut(self,text):
"""
"""
text = text.decode('utf-8','ignore')
p = self.d
ln = len(text)
i = ln
j = 0
z = ln
q = 0
recognised = []
mem = None
mem2 = None
while i-j>0:
t = text[i-j-1].lower()
#print i,j,t,mem
if not (t in p):
if (mem!=None) or (mem2!=None):
if mem!=None:
i,j,z = mem
mem = None
elif mem2!=None:
delta = mem2[0]-i
if delta>=1:
if (delta<5) and (re.search(ur"[\w\u2E80-\u9FFF]",t)!=None):
pre = text[i-j]
#print pre
if not (pre in self.specialwords):
i,j,z,q = mem2
del recognised[q:]
mem2 = None
p = self.d
if((i<ln) and (i<z)):
unreg_tmp = self._pro_unreg(text[i:z])
recognised.extend(unreg_tmp)
recognised.append(text[i-j:i])
#print text[i-j:i],mem2
i = i-j
z = i
j = 0
continue
j = 0
i -= 1
p = self.d
continue
p = p[t]
j+=1
if chr(11) in p:
if j<=2:
mem = i,j,z
#print text[i-1]
if (z-i<2) and (text[i-1] in self.specialwords) and ((mem2==None) or ((mem2!=None and mem2[0]-i>1))):
#print text[i-1]
mem = None
mem2 = i,j,z,len(recognised)
p = self.d
i -= 1
j = 0
continue
#print mem
p = self.d
#print i,j,z,text[i:z]
if((i<ln) and (i<z)):
unreg_tmp = self._pro_unreg(text[i:z])
recognised.extend(unreg_tmp)
recognised.append(text[i-j:i])
i = i-j
z = i
j = 0
mem = None
mem2 = None
#print mem
if mem!=None:
i,j,z = mem
recognised.extend(self._pro_unreg(text[i:z]))
recognised.append(text[i-j:i])
else:
recognised.extend(self._pro_unreg(text[i-j:z]))
return recognised

View File

@@ -1,114 +0,0 @@

View File

@@ -1,16 +0,0 @@
# -*- coding: utf-8 -*-
from sphinx.search import SearchLanguage
from smallseg import SEG
class SearchChinese(SearchLanguage):
lang = 'zh'
def init(self, options):
print "reading Chiniese dictionary"
self.seg = SEG()
def split(self, input):
return self.seg.cut(input.encode("utf8"))
def word_filter(self, stemmed_word):
return len(stemmed_word) > 1

View File

@@ -1,22 +0,0 @@
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
"""
Topic: 工具集合
Desc :
"""
import sys
import os
def resource_path(relative_path):
"""获取实际路径"""
if hasattr(sys, "_MEIPASS"):
base_path = sys._MEIPASS
else:
base_path = os.path.abspath(".")
return os.path.join(base_path, relative_path)
def userhome_file(filename):
userhome = os.path.expanduser('~')
return os.path.join(userhome, filename)

View File

@@ -1,7 +0,0 @@
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
"""
Topic: sample
Desc :
"""
__author__ = 'Xiong Neng'

View File

@@ -1,47 +0,0 @@
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
"""
Topic: 简单的一个button点击关闭窗口
Desc :
"""
__author__ = 'Xiong Neng'
import wx
class MyFrame(wx.Frame):
"""Frame class that displays an image"""
def __init__(self, parent, id):
"""Create a frame instnace and display image"""
wx.Frame.__init__(self, parent,id,'Frame With Button', size=(300,100))
panel = wx.Panel(self) # 创建画板
# 将按钮添加到画板中去
button = wx.Button(panel, label='Close', pos=(125, 10), size=(50, 50))
# 绑定按钮单击事件
self.Bind(wx.EVT_BUTTON, self.OnCloseMe, button)
# 绑定窗口关闭事件
self.Bind(wx.EVT_CLOSE, self.OnCloseWindow)
def OnCloseMe(self, event):
self.Close(True)
def OnCloseWindow(self, event):
self.Destroy()
class MyApp(wx.App):
"""Application class."""
def OnInit(self):
self.frame = MyFrame(parent=None, id=-1)
self.frame.Show(True)
self.SetTopWindow(self.frame)
return True
def main():
app = MyApp()
app.MainLoop()

View File

@@ -1,75 +0,0 @@
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
"""
Topic: 创建自定义事件并绑定,两个按钮都点击后才产生事件
Desc :
"""
import wx
class TwoButtonEvent(wx.PyCommandEvent):
"""先定义一个自定义事件"""
def __init__(self, evtType, id):
wx.PyCommandEvent.__init__(self, evtType, id)
self.clickCount = 0
def getClickCount(self):
return self.clickCount
def setClickCount(self, count):
self.clickCount = count
EVT_TWO_BUTTON_TYPE = wx.NewEventType() # 创建一个事件类型
EVT_TWO_BUTTON = wx.PyEventBinder(EVT_TWO_BUTTON_TYPE, 1) # 创建一个绑定器对象
class TwoButtonPanel(wx.Panel):
def __init__(self, parent, id=-1, leftText='Left', rightText='Right'):
wx.Panel.__init__(self, parent, id)
self.leftButton = wx.Button(self, label=leftText)
self.rightButton = wx.Button(self, label=rightText, pos=(100, 0))
self.leftClick = False
self.rightClick = False
self.clickCount = 0
# 4 下面两行绑定更低级的事件
self.leftButton.Bind(wx.EVT_LEFT_DOWN, self.OnLeftClick)
self.rightButton.Bind(wx.EVT_LEFT_DOWN, self.OnRightClick)
def OnLeftClick(self, event):
self.leftClick = True
self.OnClick()
event.Skip() # 继续处理
def OnRightClick(self, event):
self.rightClick = True
self.OnClick()
event.Skip()
def OnClick(self):
self.clickCount += 1
if self.leftClick and self.rightClick:
self.leftClick = False
self.rightClick = False
# 创建自定义事件
myevent = TwoButtonEvent(EVT_TWO_BUTTON_TYPE, self.GetId())
myevent.setClickCount(self.clickCount) # 添加数据到事件
self.GetEventHandler().ProcessEvent(myevent) # 处理事件
class CustomEventFrame(wx.Frame):
def __init__(self, parent, id):
wx.Frame.__init__(self, parent, id, 'Click Count: 0', size=(300, 100))
panel = TwoButtonPanel(self)
self.Bind(EVT_TWO_BUTTON, self.OnTwoClick, panel) # 绑定自定义事件
def OnTwoClick(self, event): # 定义一个事件处理器
self.SetTitle('Click count: %s' % event.getClickCount())
def main():
app = wx.App()
frame = CustomEventFrame(parent=None, id=-1)
frame.Show()
app.MainLoop()

View File

@@ -1,32 +0,0 @@
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
"""
Topic: 对话框
Desc :
"""
__author__ = 'Xiong Neng'
import wx
def main():
app = wx.App()
# --------------------确认对话框--------------------------
# dlg = wx.MessageDialog(None, 'Is this the coolest thing ever!',
# 'MessageDialog', wx.YES_NO | wx.ICON_QUESTION)
# # wx.ID_YES, wx.ID_NO, wx.ID_CANCEL, wx.ID_OK
# result = dlg.ShowModal()
# ---------------------文本输入对话框-----------------------
# dlg = wx.TextEntryDialog(None, "Who is buried in Grant's tomb?",
# 'A Question', 'Cary Grant')
# if dlg.ShowModal() == wx.ID_OK:
# response = dlg.GetValue()
# ---------------------列表选择对话框-----------------------
dlg = wx.SingleChoiceDialog(None,
'What version of Python are you using?',
'Single Choice',
['1.5.2', '2.0', '2.6.3', '2.7', '2.7.8'])
if dlg.ShowModal() == wx.ID_OK:
response = dlg.GetStringSelection()
print(response)
app.MainLoop()

View File

@@ -1,55 +0,0 @@
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
"""
Topic: 事件绑定示例
Desc :
"""
import wx
class MouseEventFrame(wx.Frame):
def __init__(self, parent, id):
wx.Frame.__init__(self, parent, id, 'Show Event Bindings', size=(300, 100))
self.panel = wx.Panel(self)
self.button = wx.Button(self.panel, label='Not Over', pos=(100, 15))
self.Bind(wx.EVT_BUTTON, self.OnButtonClick, self.button) # 绑定button点击事件
self.button.Bind(wx.EVT_ENTER_WINDOW, self.OnEnterWindow) # 光标位于其上事件
self.button.Bind(wx.EVT_LEAVE_WINDOW, self.OnLeaveWindow) # 光标离开事件
def OnButtonClick(self, event):
self.panel.SetBackgroundColour('Green')
self.panel.Refresh()
def OnEnterWindow(self, event):
self.button.SetLabel('Over Me!')
event.Skip()
def OnLeaveWindow(self, event):
self.button.SetLabel('Not Over')
event.Skip()
class DoubleEventFrame(wx.Frame):
"""同时监听两个事件"""
def __init__(self, parent, id):
wx.Frame.__init__(self, parent, id, 'Show Event Bindings', size=(300, 100))
self.panel = wx.Panel(self)
self.button = wx.Button(self.panel, label='Not Over', pos=(100, 15))
self.Bind(wx.EVT_BUTTON, self.OnButtonClick, self.button) # 绑定button点击事件
self.button.Bind(wx.EVT_LEFT_DOWN, self.OnMouseDown) # 鼠标左键点击
def OnButtonClick(self, event):
"""鼠标点击后释放才会有这个Click事件"""
self.panel.SetBackgroundColour('Green')
self.panel.Refresh()
def OnMouseDown(self, event):
self.button.SetLabel('Over Me!')
event.Skip() # 鼠标左键事件会优先产生这时候Skip()会继续去传递这个事件
def main():
app = wx.App()
# frame = MouseEventFrame(parent=None, id=-1)
frame = DoubleEventFrame(parent=None, id=-1)
frame.Show()
app.MainLoop()

View File

@@ -1,59 +0,0 @@
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
"""
Topic: 布局管理器gridbag sizer
Desc :
"""
import wx
class BlockWindow(wx.Panel):
def __init__(self, parent, ID=-1, label='',
pos=wx.DefaultPosition, size=(100, 25)):
wx.Panel.__init__(self, parent, ID, pos, size,
wx.RAISED_BORDER, label)
self.label = label
self.SetBackgroundColour('white')
self.SetMinSize(size)
self.Bind(wx.EVT_PAINT, self.OnPaint)
def OnPaint(self, evt):
sz = self.GetClientSize()
dc = wx.PaintDC(self)
w, h = dc.GetTextExtent(self.label)
dc.SetFont(self.GetFont())
dc.DrawText(self.label, (sz.width - w) / 2, (sz.height - h) / 2)
labels = 'one two three four five six seven eight nine'.split()
class GridbagFrame(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None, -1, 'GridBagSizer')
sizer = wx.GridBagSizer(hgap=5, vgap=5)
for col in range(3):
for row in range(3):
bw = BlockWindow(self, label=labels[row * 3 + col])
sizer.Add(bw, pos=(row, col))
# 跨行
bw = BlockWindow(self, label='span 3 rows')
sizer.Add(bw, pos=(0, 3), span=(3, 1), flag=wx.EXPAND)
# 跨列
bw = BlockWindow(self, label='span all columns')
sizer.Add(bw, pos=(3, 0), span=(1, 4), flag=wx.EXPAND)
# 使最后的行和列可增加
sizer.AddGrowableCol(3)
sizer.AddGrowableRow(3)
self.SetSizer(sizer)
self.Fit()
def main():
app = wx.App()
GridbagFrame().Show()
app.MainLoop()

View File

@@ -1,52 +0,0 @@
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
"""
Topic: 菜单栏、工具栏、状态栏
Desc :
"""
__author__ = 'Xiong Neng'
import wx
import wx.py.images as images
class MenuToobarFrame(wx.Frame):
"""Frame class that displays an image"""
def __init__(self, parent, id):
"""Create a frame instnace and display image"""
wx.Frame.__init__(self, parent,id,'Toolbars', size=(300, 200))
panel = wx.Panel(self) # 创建画板
panel.SetBackgroundColour('White')
statusBar = self.CreateStatusBar() # 创建状态栏
toolbar = self.CreateToolBar() # 创建工具栏
# 给工具栏增加一个工具
toolbar.AddSimpleTool(wx.NewId(), images.getPyBitmap(), 'New', "Long help for 'New'")
toolbar.Realize() # 准备显示工具栏
menuBar = wx.MenuBar() # 创建一个菜单栏
# 创建两个菜单
menu1 = wx.Menu()
menuBar.Append(menu1, '&File')
menu1.Append(-1, "&Open...", 'Open new file')
menuItem = menu1.Append(-1, "&Exit...", 'Exit System')
# 菜单项绑定事件
self.Bind(wx.EVT_MENU, self.OnCloseMe, menuItem)
menu2 = wx.Menu()
# 创建菜单项MenuItem
menu2.Append(wx.NewId(), '&Copy', 'Copy in status bar')
menu2.Append(wx.NewId(), '&Cut', '')
menu2.Append(wx.NewId(), '&Paste','')
menu2.AppendSeparator()
menu2.Append(wx.NewId(), '&Options', 'Display Options')
menuBar.Append(menu2, '&Edit') # 在菜单栏上附上菜单
self.SetMenuBar(menuBar) # 在Frame上面附加菜单
def OnCloseMe(self, event):
self.Close(True)
def main():
app = wx.App()
frame = MenuToobarFrame(parent=None, id=-1)
frame.Show()
app.MainLoop()

View File

@@ -1,98 +0,0 @@
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
"""
Topic: 进度条
Desc :
"""
import time
import wx
from threading import Thread
from wx.lib.pubsub import pub
########################################################################
class TestThread(Thread):
"""Test Worker Thread Class."""
# ----------------------------------------------------------------------
def __init__(self):
"""Init Worker Thread Class."""
Thread.__init__(self)
self.start() # start the thread
# ----------------------------------------------------------------------
def run(self):
"""Run Worker Thread."""
# This is the code executing in the new thread.
for i in range(20):
time.sleep(1)
wx.CallAfter(pub.sendMessage, "update", msg="")
########################################################################
class MyProgressDialog(wx.Dialog):
""""""
# ----------------------------------------------------------------------
def __init__(self):
"""Constructor"""
wx.Dialog.__init__(self, None, title="Progress")
self.count = 0
self.progress = wx.Gauge(self, -1, 50, (20, 50), size=(250, 25))
sizer = wx.BoxSizer(wx.VERTICAL)
sizer.Add(self.progress, 0, wx.EXPAND)
self.SetSizer(sizer)
# create a pubsub receiver
pub.subscribe(self.updateProgress, "update")
# ----------------------------------------------------------------------
def updateProgress(self, msg):
""""""
self.count += 1
if self.count >= 50:
self.Destroy()
self.progress.SetValue(self.count)
########################################################################
class MyForm(wx.Frame):
# ----------------------------------------------------------------------
def __init__(self):
wx.Frame.__init__(self, None, wx.ID_ANY, "Tutorial")
# Add a panel so it looks the correct on all platforms
panel = wx.Panel(self, wx.ID_ANY)
self.btn = btn = wx.Button(panel, label="Start Thread")
btn.Bind(wx.EVT_BUTTON, self.onButton)
sizer = wx.BoxSizer(wx.VERTICAL)
sizer.Add(btn, 0, wx.ALL | wx.CENTER, 5)
panel.SetSizer(sizer)
# ----------------------------------------------------------------------
def onButton(self, event):
"""
Runs the thread
"""
btn = event.GetEventObject()
btn.Disable()
TestThread()
dlg = MyProgressDialog()
dlg.ShowModal()
btn.Enable()
# ----------------------------------------------------------------------
# Run the program
def main():
app = wx.App()
MyForm().Show()
app.MainLoop()

View File

@@ -1,99 +0,0 @@
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
"""
Topic: 真实form表单sizer复杂度适中
Desc :
"""
import wx
class FormFrame(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None, -1, 'Real World')
panel = wx.Panel(self)
# 首先创建controls
topLbl = wx.StaticText(panel, -1, 'Account Information')
topLbl.SetFont(wx.Font(18, wx.SWISS, wx.NORMAL, wx.BOLD))
nameLbl = wx.StaticText(panel, -1, 'Name:')
name = wx.TextCtrl(panel, -1, '') # 文本输入框
addrLbl = wx.StaticText(panel, -1, 'Address:')
addr1 = wx.TextCtrl(panel, -1, '')
addr2 = wx.TextCtrl(panel, -1, '')
cstLbl = wx.StaticText(panel, -1, 'City,State,Zip:')
city = wx.TextCtrl(panel, -1, '', size=(150, -1))
state = wx.TextCtrl(panel, -1, '', size=(50, -1))
zip = wx.TextCtrl(panel, -1, '', size=(70, -1))
phoneLbl = wx.StaticText(panel, -1, 'Phone:')
phone = wx.TextCtrl(panel, -1, '')
emailLbl = wx.StaticText(panel, -1, 'Email:')
email = wx.TextCtrl(panel, -1, '')
saveBtn = wx.Button(panel, -1, 'Save')
cancelBtn = wx.Button(panel, -1, 'Cancel')
# 下面开始布局
# mainSizer是顶级sizer控制所有部件使用box sizer
# 垂直sizer
mainSizer = wx.BoxSizer(wx.VERTICAL)
# boxsizer.Add(btn1, proportion=0, flag=wx.ALL, border=2)
mainSizer.Add(topLbl, 0, wx.ALL, 5)
mainSizer.Add(wx.StaticLine(panel), 0, wx.EXPAND | wx.TOP | wx.BOTTOM, 5)
# 地址列
# addrSizer控制所有地址信息使用gridbag sizer
addrSizer = wx.GridBagSizer(hgap=5, vgap=5)
# sizer.Add(bw, pos=(3,0), span=(1,4), flag=wx.EXPAND)
addrSizer.Add(nameLbl, pos=(0, 0), flag=wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL)
addrSizer.Add(name, pos=(0, 1), flag=wx.EXPAND)
addrSizer.Add(addrLbl, pos=(1, 0), flag=wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL)
addrSizer.Add(addr1, pos=(1, 1), flag=wx.EXPAND)
# 带有空白空间的行
addrSizer.Add((10, 10), pos=(2, 0), span=(1, 1), flag=wx.EXPAND) # 一些空白空间
addrSizer.Add(addr2, pos=(2, 1), flag=wx.EXPAND)
addrSizer.Add(cstLbl, pos=(3, 0), flag=wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL)
# city,state,zip放到一个嵌套sizer中使用BoxSizer
# 水平嵌套Sizer
cstSizer = wx.BoxSizer(wx.HORIZONTAL)
cstSizer.Add(city, 1)
cstSizer.Add(state, 0, wx.LEFT | wx.RIGHT, 5)
cstSizer.Add(zip)
# 把cstSizer加入到addrSizer中
addrSizer.Add(cstSizer, pos=(3, 1), span=(1, 1), flag=wx.EXPAND)
# 电话和电子邮箱
addrSizer.Add(phoneLbl, pos=(4, 0), flag=wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL)
addrSizer.Add(phone, pos=(4, 1), flag=wx.EXPAND)
addrSizer.Add(emailLbl, pos=(5, 0), flag=wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL)
addrSizer.Add(email, pos=(5, 1), flag=wx.EXPAND)
addrSizer.AddGrowableCol(1)
# 然后把addrSizer添加到mainSizer中
mainSizer.Add(addrSizer, 0, wx.EXPAND | wx.ALL, 10)
# 按钮放到两边和中间都能伸缩间隔的一行中
btnSizer = wx.BoxSizer(wx.HORIZONTAL)
btnSizer.Add((20, 20), 1)
btnSizer.Add(saveBtn)
btnSizer.Add((20, 20), 1)
btnSizer.Add(cancelBtn)
btnSizer.Add((20, 20), 1)
mainSizer.Add(btnSizer, 0, wx.EXPAND | wx.BOTTOM, 10)
panel.SetSizer(mainSizer)
# 让框架自适应sizer如果panel改变大小框架会自动调整尺寸
# 同时还能防止框架比panel最小尺寸还小
mainSizer.Fit(self)
mainSizer.SetSizeHints(self)
self.Centre()
self.Show()
def main():
app = wx.App()
FormFrame()
app.MainLoop()

View File

@@ -1,28 +0,0 @@
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
"""
Topic: 显示鼠标的位置
Desc :
"""
import wx
__author__ = 'Xiong Neng'
class MyFrame(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None, -1, "My Frame", size=(300, 300))
panel = wx.Panel(self, -1)
panel.Bind(wx.EVT_MOTION, self.OnMove)
wx.StaticText(panel, -1, 'Pos: ', pos=(40, 10))
self.posCtrl = wx.TextCtrl(panel, -1, '', pos=(40, 10))
def OnMove(self, event):
pos = event.GetPosition()
self.posCtrl.SetValue('%s, %s' % (pos.x, pos.y))
def main():
app = wx.App()
frame = MyFrame()
frame.Show(True)
app.MainLoop()

View File

@@ -1,39 +0,0 @@
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
"""
Topic: 显示一张图片
Desc :
"""
__author__ = 'Xiong Neng'
import wx
import commons.util as util
class MyFrame(wx.Frame):
"""Frame class that displays an image"""
def __init__(self, image, parent=None, id=-1,
pos=wx.DefaultPosition,
title='Hello, wxPython!'):
"""Create a frame instnace and display image"""
temp = image.ConvertToBitmap()
size = temp.GetWidth(), temp.GetHeight()
wx.Frame.__init__(self, parent, id, title, pos, size)
self.bmp = wx.StaticBitmap(parent=self, bitmap=temp)
class MyApp(wx.App):
"""Application class."""
def OnInit(self):
img = wx.Image(util.resource_path('resources/f22.jpg'), wx.BITMAP_TYPE_JPEG)
self.frame = MyFrame(image=img)
self.frame.Show(True)
self.SetTopWindow(self.frame)
return True
def main():
app = MyApp()
app.MainLoop()

View File

@@ -1,69 +0,0 @@
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
"""
Topic: 显示文本
Desc :
"""
import wx
class StaticTextFrame(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None, -1, 'Static Text Example',
size=(400, 300))
panel = wx.Panel(self, -1)
# 这是一个基本的静态文本
wx.StaticText(panel, -1, 'This is an example of static text',
(100, 10))
# 指定了前景色和背景色的静态文本
rev = wx.StaticText(panel, -1, 'Static Text With Reversed Colors',
(100, 30))
rev.SetForegroundColour('white')
rev.SetBackgroundColour('black')
# 指定居中对齐的的静态文本
center = wx.StaticText(panel, -1, 'align center', (100, 50),
(160, -1), wx.ALIGN_CENTER)
center.SetForegroundColour('white')
center.SetBackgroundColour('black')
# 指定右对齐的静态文本
right = wx.StaticText(panel, -1, 'align right', (100, 70),
(160, -1), wx.ALIGN_RIGHT)
right.SetForegroundColour('white')
right.SetBackgroundColour('black')
# 指定新字体的静态文本
str = 'You can also change the font.'
text = wx.StaticText(panel, -1, str, (20, 100))
font = wx.Font(18, wx.DECORATIVE, wx.ITALIC, wx.NORMAL)
text.SetFont(font)
# 显示多行文本
wx.StaticText(panel, -1, 'Your text\ncan be split\n'
'over multiple lines\n\neven blank ones', (20, 150))
# 显示对齐的多行文本
wx.StaticText(panel, -1, 'Multi-line text\ncan also\n'
'be right aligned\n\neven with a blank', (220, 150),
style=wx.ALIGN_RIGHT)
class TextFrame(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None, -1, 'Text Entry Example',
size=(300, 100))
panel = wx.Panel(self, -1)
basicLabel = wx.StaticText(panel, -1, 'Basic Control:')
basicText = wx.TextCtrl(panel, -1, "I've entered some text!",
size=(175, -1))
basicText.SetInsertionPoint(0)
pwdLabel = wx.StaticText(panel, -1, 'Password:')
pwdText = wx.TextCtrl(panel, -1, 'password', size=(175, -1),
style=wx.TE_PASSWORD)
sizer = wx.FlexGridSizer(cols=2, hgap=6, vgap=6)
sizer.AddMany([basicLabel, basicText, pwdLabel, pwdText])
panel.SetSizer(sizer)
def main():
app = wx.App()
# frame = StaticTextFrame()
frame = TextFrame()
frame.Show()
app.MainLoop()

View File

@@ -1,264 +0,0 @@
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
"""
Topic: 一个完整的画图程序
Desc :
"""
import wx
import commons.util as util
class SketchWindow(wx.Window):
def __init__(self, parent, id):
wx.Window.__init__(self, parent, id)
self.SetBackgroundColour('White')
self.color = 'Black'
self.thickness = 1
# 创建一支笔wx.Pen对象
self.pen = wx.Pen(self.color, self.thickness, wx.SOLID)
self.lines = []
self.curLine = []
self.pos = (0, 0)
self.InitBuffer()
self.Bind(wx.EVT_LEFT_DOWN, self.OnLeftDown)
self.Bind(wx.EVT_LEFT_UP, self.OnLeftUp)
self.Bind(wx.EVT_MOTION, self.OnMotion)
self.Bind(wx.EVT_SIZE, self.OnSize)
self.Bind(wx.EVT_IDLE, self.OnIdle)
self.Bind(wx.EVT_PAINT, self.OnPaint)
def InitBuffer(self):
size = self.GetClientSize()
self.buffer = wx.EmptyBitmap(size.width, size.height)
dc = wx.BufferedDC(None, self.buffer)
dc.SetBackground(wx.Brush(self.GetBackgroundColour()))
dc.Clear()
self.DrawLines(dc)
self.reInitBuffer = False
def GetLinesData(self):
return self.lines[:]
def SetLinesData(self, lines):
self.lines = lines[:]
self.InitBuffer()
self.Refresh()
def OnLeftDown(self, event):
self.curLine = []
self.pos = event.GetPositionTuple()
self.CaptureMouse()
def OnLeftUp(self, event):
if self.HasCapture():
self.lines.append((self.color, self.thickness, self.curLine))
self.curLine = []
self.ReleaseMouse()
def OnMotion(self, event):
if event.Dragging() and event.LeftIsDown():
dc = wx.BufferedDC(wx.ClientDC(self), self.buffer)
self.drawMotion(dc, event)
event.Skip()
def drawMotion(self, dc, event):
dc.SetPen(self.pen)
newPos = event.GetPositionTuple()
coords = self.pos + newPos
self.curLine.append(coords)
dc.DrawLine(*coords)
self.pos = newPos
def OnSize(self, event):
self.reInitBuffer = True
def OnIdle(self, event):
if self.reInitBuffer:
self.InitBuffer()
self.Refresh(False)
def OnPaint(self, event):
dc = wx.BufferedPaintDC(self, self.buffer)
def DrawLines(self, dc):
for colour, thickness, line in self.lines:
pen = wx.Pen(colour, thickness, wx.SOLID)
dc.SetPen(pen)
for coords in line:
dc.DrawLine(*coords)
def SetColor(self, color):
self.color = color
self.pen = wx.Pen(self.color, self.thickness, wx.SOLID)
def SetThickness(self, num):
self.thickness = num
self.pen = wx.Pen(self.color, self.thickness, wx.SOLID)
class SketchFrame(wx.Frame):
def __init__(self, parent):
wx.Frame.__init__(self, parent, -1, 'Sketch Frame',
size=(800, 600))
self.sketch = SketchWindow(self, -1)
self.sketch.Bind(wx.EVT_MOTION, self.OnSketchMotion)
self.initStatusBar()
self.createMenuBar()
self.createToolBar()
def initStatusBar(self):
self.statusbar = self.CreateStatusBar()
self.statusbar.SetFieldsCount(3)
self.statusbar.SetStatusWidths([-1, -2, -3])
def OnSketchMotion(self, event):
self.statusbar.SetStatusText(
"Pos: %s" % str(event.GetPositionTuple()), 0)
self.statusbar.SetStatusText(
"Current Pts: %s" % len(self.sketch.curLine), 1)
self.statusbar.SetStatusText(
"Line Count: %s" % len(self.sketch.lines), 2)
event.Skip()
def menuData(self):
return [("&File", (
("&New", "New Sketch file", self.OnNew),
("&Open", "Open sketch file", self.OnOpen),
("&Save", "Save sketch file", self.OnSave),
("", "", ""),
("&Color", (
("&Black", "", self.OnColor,
wx.ITEM_RADIO),
("&Red", "", self.OnColor,
wx.ITEM_RADIO),
("&Green", "", self.OnColor,
wx.ITEM_RADIO),
("&Blue", "", self.OnColor,
wx.ITEM_RADIO))),
("", "", ""),
("&Quit", "Quit", self.OnCloseWindow)))]
def createMenuBar(self):
menuBar = wx.MenuBar()
for eachMenuData in self.menuData():
menuLabel = eachMenuData[0]
menuItems = eachMenuData[1]
menuBar.Append(self.createMenu(menuItems), menuLabel)
self.SetMenuBar(menuBar)
def createMenu(self, menuData):
menu = wx.Menu()
for eachItem in menuData:
if len(eachItem) == 2:
label = eachItem[0]
subMenu = self.createMenu(eachItem[1])
menu.AppendMenu(wx.NewId(), label, subMenu)
else:
self.createMenuItem(menu, *eachItem)
return menu
def createMenuItem(self, menu, label, status, handler,
kind=wx.ITEM_NORMAL):
if not label:
menu.AppendSeparator()
return
menuItem = menu.Append(-1, label, status, kind)
self.Bind(wx.EVT_MENU, handler, menuItem)
def OnNew(self, event):
pass
def OnOpen(self, event):
pass
def OnSave(self, event):
pass
def OnColor(self, event):
menubar = self.GetMenuBar()
itemId = event.GetId()
item = menubar.FindItemById(itemId)
color = item.GetLabel()
self.sketch.SetColor(color)
def OnCloseWindow(self, event):
self.Destroy()
def createToolBar(self):
toolbar = self.CreateToolBar()
for each in self.toolbarData():
self.createSimpleTool(toolbar, *each)
toolbar.AddSeparator()
for each in self.toolbarColorData():
self.createColorTool(toolbar, each)
toolbar.Realize()
def createSimpleTool(self, toolbar, label, filename,
help, handler):
if not label:
toolbar.AddSeparator()
return
bmp = wx.Image(filename,
wx.BITMAP_TYPE_BMP).ConvertToBitmap()
tool = toolbar.AddSimpleTool(-1, bmp, label, help)
self.Bind(wx.EVT_MENU, handler, tool)
def toolbarData(self):
return (("New", util.resource_path("resources/new.bmp")
, "Create new sketch", self.OnNew),
("", "", "", ""),
("Open", util.resource_path("resources/open.bmp")
, "Open existing sketch", self.OnOpen),
("Save", util.resource_path("resources/save.bmp")
, "Save existing sketch", self.OnSave))
def createColorTool(self, toolbar, color):
bmp = self.MakeBitmap(color)
newId = wx.NewId()
tool = toolbar.AddRadioTool(-1, bmp, shortHelp=color)
self.Bind(wx.EVT_MENU, self.OnColor, tool)
def MakeBitmap(self, color):
bmp = wx.EmptyBitmap(16, 15)
dc = wx.MemoryDC()
dc.SelectObject(bmp)
dc.SetBackground(wx.Brush(color))
dc.Clear()
dc.SelectObject(wx.NullBitmap)
return bmp
def toolbarColorData(self):
return ("Black", "Red", "Green", "Blue")
def OnColor(self, event):
menubar = self.GetMenuBar()
itemId = event.GetId()
item = menubar.FindItemById(itemId)
if not item:
toolbar = self.GetToolBar()
item = toolbar.FindById(itemId)
color = item.GetShortHelp()
else:
color = item.GetLabel()
self.sketch.SetColor(color)
class SketchApp(wx.App):
def OnInit(self):
image = wx.Image(
util.resource_path('resources/splash.bmp'), wx.BITMAP_TYPE_BMP)
bmp = image.ConvertToBitmap()
wx.SplashScreen(bmp, wx.SPLASH_CENTER_ON_SCREEN |
wx.SPLASH_TIMEOUT, 1000, None, -1)
wx.Yield()
import time
time.sleep(1)
frame = SketchFrame(None)
frame.Show()
self.SetTopWindow(frame)
return True
def main():
app = SketchApp()
app.MainLoop()

View File

@@ -1,168 +0,0 @@
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
"""
Topic: paramiko模块演示
https://github.com/paramiko/paramiko/tree/master/demos
安装python3-pycrypto-windows
python3.4版本之前http://www.voidspace.org.uk/python/modules.shtml#pycrypto
python3.4最新版本https://github.com/axper/python3-pycrypto-windows-installer
先安装Visual C++ 2010 Express这个是免费的
http://www.visualstudio.com/zh-cn/downloads/download-visual-studio-vs#DownloadFamilies_4
安装后可以先试着pip install paramiko看能不能成功如果还不行就再下载下面的
如果安装上面的最后提示还有个SQL Server 2008 Express Service Pack1没安装成功那么自己手动去下载安装
http://www.microsoft.com/zh-tw/download/details.aspx?id=25052
pip install paramiko
"""
import paramiko
import os
from os import listdir
from os.path import isfile, join
import zipfile
import logging
HOSTNAME = '115.29.145.245' # remote hostname where SSH server is running
PORT = 22
USERNAME = 'winhong'
PASSWORD = 'jianji2014'
# RSA_PRIVATE_KEY = r"/home/paramikouser/.ssh/rsa_private_key"
DIR_LOCAL = r'D:\Wingarden\src\trunk\ling\target\classes\com'
DIR_REMOTE_CONFIG = r"/usr/local/apache-tomcat-8.0.15/webapps/ROOT/WEB-INF/classes"
DIR_REMOTE = r"/usr/local/apache-tomcat-8.0.15/webapps/ROOT/WEB-INF/classes/com"
COMMAND_01 = '/home/winhong/ling01.sh'
COMMAND_02 = '/home/winhong/ling02.sh'
ZIPDIR_SRC = r'D:\Wingarden\src\trunk\ling\target\classes\com'
ZIPDIR_DEST = r'D:\Wingarden\src\trunk\ling'
ZIPNAME = 'ling.zip'
ZIPNAME_CONFIG = 'lingconfig.zip'
# get host key, if we know one
# HOSTKEYTYPE = None
# HOSTKEY = None
_LOGGING = logging.getLogger('ztransfer')
def zipdir(path, zipf):
for root, dirs, files in os.walk(path):
for myfile in files:
zipf.write(os.path.join(root, myfile),
arcname=os.path.join(root.split('\com\\', 1)[1], myfile))
def zipdir_config(mypath, zipf):
onlyfiles = [f for f in listdir(mypath) if isfile(join(mypath, f))]
for myfile in onlyfiles:
if myfile.endswith('config.properties'):
continue
elif myfile.endswith('config.properties.tmp'):
zipf.write(os.path.join(mypath, myfile), arcname='config.properties')
else:
zipf.write(os.path.join(mypath, myfile), arcname=myfile)
def ziputil(zip_dir_src, zip_dir_dest):
_LOGGING.info('#ziputil start')
# check if exists delete it
check_zip_file = os.path.join(zip_dir_dest, ZIPNAME)
zip_dir_dest_config = os.path.abspath(os.path.join(zip_dir_dest, '..'))
check_zip_file_config = os.path.join(zip_dir_dest_config, ZIPNAME_CONFIG)
if os.path.isfile(check_zip_file):
os.remove(check_zip_file)
if os.path.isfile(check_zip_file_config):
os.remove(check_zip_file_config)
zipf = zipfile.ZipFile(check_zip_file, 'w', zipfile.ZIP_DEFLATED)
zipdir(zip_dir_src, zipf)
zipf.close()
zipf_config = zipfile.ZipFile(check_zip_file_config, 'w', zipfile.ZIP_DEFLATED)
zipdir_config(os.path.abspath(os.path.join(zip_dir_src, '..')), zipf_config)
zipf_config.close()
_LOGGING.info('#ziputil end')
return zip_dir_dest, ZIPNAME, zip_dir_dest_config, ZIPNAME_CONFIG
def transfer_file(hostname_, port_, username_, password_, fdir_, fname_, fdir_config, fname_config):
_LOGGING.info('#transfer_file start')
local_file = os.path.join(fdir_, fname_)
local_file_config = os.path.join(fdir_config, fname_config)
try:
_LOGGING.info('Establishing SSH connection to: %s:%s' % (hostname_, port_))
t = paramiko.Transport((hostname_, port_))
t.start_client()
if not t.is_authenticated():
_LOGGING.info('Trying password login...')
t.auth_password(username=username_, password=password_)
sftp = paramiko.SFTPClient.from_transport(t)
remote_file = DIR_REMOTE + '/' + fname_
remote_file_config = DIR_REMOTE_CONFIG + '/' + fname_config
try:
_LOGGING.info('start transport...')
sftp.put(local_file, remote_file)
sftp.put(local_file_config, remote_file_config)
except:
_LOGGING.error('error...')
raise
t.close()
except Exception as e:
_LOGGING.error('transfer error...')
try:
_LOGGING.info('end transport and close it...')
t.close()
except:
pass
finally:
_LOGGING.info(u'传输完成后删除本地的zip文件...')
if os.path.isfile(local_file):
os.remove(local_file)
if os.path.isfile(local_file_config):
os.remove(local_file_config)
_LOGGING.info('#transfer_file end')
def exe_command(hostname_, username_, password_, commandpaths_):
_LOGGING.info('#exe_command start')
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(hostname_, username=username_, password=password_)
# channel = ssh.invoke_shell()
# ssh_stdin, ssh_stdout, ssh_stderr = channel.exec_command(commandpath_)
for command_ in commandpaths_:
commandpath_, issudo = command_
ssh_stdin, ssh_stdout, ssh_stderr = ssh.exec_command(commandpath_, get_pty=issudo)
for eline in ssh_stdout.readlines():
pass
# _LOGGING.info('ssh_stdout:%s' % (eline,))
for eline in ssh_stderr.readlines():
pass
_LOGGING.error('ssh_stderr:%s' % (eline,))
# Cleanup
ssh_stdin.close()
ssh_stdout.close()
ssh_stderr.close()
# channel.close()
ssh.close()
_LOGGING.info('#exe_command end')
return True
def main():
# 第一步zip压缩class文件包和配置文件包
ffdir, ffname, cfdir, cfname = ziputil(ZIPDIR_SRC, ZIPDIR_DEST)
# 第二步SSH传输class文件压缩包和配置文件压缩包
transfer_file(HOSTNAME, PORT, USERNAME, PASSWORD, ffdir, ffname, cfdir, cfname)
# 第四步执行远程shell脚本替换配置文件和class文件并重启注意sudo和非sudo分开执行
return exe_command(HOSTNAME, USERNAME, PASSWORD, [(COMMAND_01, True), (COMMAND_02, False)])

View File

@@ -1,582 +0,0 @@
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
"""
Topic: 小令自动发布工具
Desc :
"""
import wx
import wx.html
import examples.ztransfer as ztransfer
import commons.util as zutil
import os
import subprocess
import logging
import time
import tempfile
import sys
from threading import Thread
from wx.lib.pubsub import pub
import ConfigParser
import wx.lib.agw.pyprogress as PP
HOSTNAME_ = '115.29.145.245' # remote hostname where SSH server is running
USERNAME_ = 'winhong'
PASSWORD_ = 'jianji2014'
TOMAT_REMOTE_ = r"/usr/local/apache-tomcat-8.0.15"
# DIR_REMOTE = r"/usr/local/apache-tomcat-8.0.15/webapps/ROOT/WEB-INF/classes/com"
COMMAND_01_ = '/home/winhong/ling01.sh'
COMMAND_02_ = '/home/winhong/ling02.sh'
_LOGGING = logging.getLogger('zupload')
IS_WIN32 = 'win32' in str(sys.platform).lower()
def subprocess_call(*args, **kwargs):
# also works for Popen. It creates a new *hidden* window,
# so it will work in frozen apps (.exe).
if IS_WIN32:
_LOGGING.info('subprocess_call==IS_WIN32')
startupinfo = subprocess.STARTUPINFO()
startupinfo.dwFlags = subprocess.CREATE_NEW_CONSOLE | subprocess.STARTF_USESHOWWINDOW
startupinfo.wShowWindow = subprocess.SW_HIDE
kwargs['startupinfo'] = startupinfo
retcode = subprocess.call(*args, **kwargs)
return retcode
def subprocess_popen(*args, **kwargs):
# also works for Popen. It creates a new *hidden* window,
# so it will work in frozen apps (.exe).
if IS_WIN32:
_LOGGING.info('subprocess_call==IS_WIN32')
startupinfo = subprocess.STARTUPINFO()
startupinfo.dwFlags = subprocess.CREATE_NEW_CONSOLE | subprocess.STARTF_USESHOWWINDOW
startupinfo.wShowWindow = subprocess.SW_HIDE
kwargs['startupinfo'] = startupinfo
ppopen = subprocess.Popen(*args, **kwargs)
return ppopen
class MyConfig():
def __init__(self, hostname=HOSTNAME_, username=USERNAME_, password=PASSWORD_,
projdir='', mavendir='', tomcatdir=TOMAT_REMOTE_,
command1=COMMAND_01_, command2=COMMAND_02_):
self.hostname = hostname
self.username = username
self.password = password
self.projdir = projdir
self.mavendir = mavendir
self.tomcatdir = tomcatdir
self.command1 = command1
self.command2 = command2
def saveConfig(myconfig):
config_file = zutil.userhome_file('ztool.conf')
# check if file exists
cf = ConfigParser.ConfigParser()
if os.path.isfile(config_file):
# update file
cf.read(config_file)
else:
# create file
cf.add_section('main')
for k, v in vars(myconfig).iteritems():
cf.set("main", k, v)
with open(config_file, "w") as f:
cf.write(f)
def loadConfig():
config = MyConfig()
userhome = os.path.expanduser('~')
config_file = os.path.join(userhome, 'ztool.conf')
if os.path.isfile(config_file):
cf = ConfigParser.ConfigParser()
cf.read(config_file)
for k, v in vars(config).iteritems():
setattr(config, k, cf.get('main', k))
return config
class Ling01(wx.Dialog):
text = u'''
<html>
<body bgcolor="#ACAA60">
<center>
<table bgcolor="#455481" width="100%" cellspacing="0"
cellpadding=”0” border=”1”>
<tr>
<td align="center"><h1>ling01.sh示例代码</h1></td>
</tr>
</table>
</center>
<p>
#!/bin/bash<br><br>
echo '先停止tomcat...'<br>
ps aux |grep tomcat |grep -v 'grep tomcat' |awk '{print $2}'|sudo xargs kill -9<br>
wait<br><br>
echo '成功停止!开始替换class文件'<br>
cd /usr/local/apache-tomcat-8.0.15/webapps/ROOT/WEB-INF/classes/com<br>
rm -rf winhong/<br>
unzip ling.zip<br>
wait<br>
rm -f ling.zip<br>
echo 'class文件解压替换完成,开始替换配置文件'<br>
cd ..<br>
find . -maxdepth 1 -type f -not -name '*.zip' -print0 | xargs -0 rm<br>
unzip lingconfig.zip<br>
wait<br>
rm -f lingconfig.zip<br>
echo '配置文件解压替换完成'<br>
</p>
</body>
</html>
'''
def __init__(self, parent):
wx.Dialog.__init__(self, parent, -1, u'ling01.sh示例', size=(600, 450))
html = wx.html.HtmlWindow(self)
html.SetPage(self.text)
button = wx.Button(self, wx.ID_OK, u'确定')
sizer = wx.BoxSizer(wx.VERTICAL)
sizer.Add(html, 1, wx.EXPAND | wx.ALL, 5)
sizer.Add(button, 0, wx.ALIGN_CENTER | wx.ALL, 5)
self.SetSizer(sizer)
self.Layout()
class Ling02(wx.Dialog):
text = u'''
<html>
<body bgcolor="#ACAA60">
<center>
<table bgcolor="#455481" width="100%" cellspacing="0"
cellpadding=”0” border=”1”>
<tr>
<td align="center"><h1>ling02.sh示例代码</h1></td>
</tr>
</table>
</center>
<p>
#!/bin/bash<br><br>
echo '开始重启tomcat....'<br>
/usr/local/apache-tomcat-8.0.15/bin/startup.sh<br>
wait<br><br>
echo '重启成功...'<br>
</p>
</body>
</html>
'''
def __init__(self, parent):
wx.Dialog.__init__(self, parent, -1, u'ling02.sh示例', size=(600, 400))
html = wx.html.HtmlWindow(self)
html.SetPage(self.text)
button = wx.Button(self, wx.ID_OK, u'确定')
sizer = wx.BoxSizer(wx.VERTICAL)
sizer.Add(html, 1, wx.EXPAND | wx.ALL, 5)
sizer.Add(button, 0, wx.ALIGN_CENTER | wx.ALL, 5)
self.SetSizer(sizer)
self.Layout()
class SketchGuide(wx.Dialog):
text = u'''
<html>
<body bgcolor="#ACAA60">
<center>
<table bgcolor="#455481" width="100%" cellspacing="0"
cellpadding=”0” border=”1”>
<tr>
<td align="center"><h1>使用帮助!</h1></td>
</tr>
</table>
</center>
<p>
<b>简介:</b>自动编译代码并上传到服务器然后替换class文件并重启tomcat
</p>
<p>
<b>1.更新代码:</b>请先确保代码源代码已经从svn更新到最新了。
</p>
<p>
<b>2.Tomcat目录</b> 服务器上面Tomcat的根目录
</p>
<p>
<b>3.远程脚本1</b> 使用sudo命令去kill掉tomcat进程(参考ling01.sh)
</p>
<p>
<b>4.远程脚本2</b> 非sudo方式启动tomcat需要设置sudoers(参考ling02.sh)
</p>
<p>
<b>5.Maven目录(选填)</b> 如果mvn命令还没有添加到系统PATH中就需要填这个。
</p>
<p>
<b>6.配置文件</b> 本地:config.properties服务器config.properties.tmp。
</p>
</body>
</html>
'''
def __init__(self, parent):
wx.Dialog.__init__(self, parent, -1, 'Use Guide', size=(600, 400))
html = wx.html.HtmlWindow(self)
html.SetPage(self.text)
button = wx.Button(self, wx.ID_OK, u'确定')
sizer = wx.BoxSizer(wx.VERTICAL)
sizer.Add(html, 1, wx.EXPAND | wx.ALL, 5)
sizer.Add(button, 0, wx.ALIGN_CENTER | wx.ALL, 5)
self.SetSizer(sizer)
self.Layout()
class SketchAbout(wx.Dialog):
text = u'''
<html>
<body bgcolor="#ACAA60">
<center>
<table bgcolor="#455481" width="100%" cellspacing="0"
cellpadding=”0” border=”1”>
<tr>
<td align="center"><h1>小令发布工具</h1></td>
</tr>
<tr>
<td align="center"><h4>Profession Edition 1.0.0</h4></td>
</tr>
</table>
</center>
<br/><br/><br/><br/><br/>
<p style="text-align: right; margin-top: 100px;">
Powered By XiongNeng 2015/01/21
</p>
</body>
</html>
'''
def __init__(self, parent):
wx.Dialog.__init__(self, parent, -1, 'About', size=(600, 300))
html = wx.html.HtmlWindow(self)
html.SetPage(self.text)
button = wx.Button(self, wx.ID_OK, u'确定')
sizer = wx.BoxSizer(wx.VERTICAL)
sizer.Add(html, 1, wx.EXPAND | wx.ALL, 5)
sizer.Add(button, 0, wx.ALIGN_CENTER | wx.ALL, 5)
self.SetSizer(sizer)
self.Layout()
########################################################################
class ButtonThread(Thread):
"""Button Worker Thread Class."""
# ----------------------------------------------------------------------
def __init__(self, myframe):
"""Init Worker Thread Class."""
Thread.__init__(self)
self.myframe = myframe
# ----------------------------------------------------------------------
def run(self):
self.myframe.buttonEnd = False
self.myframe.buttonResult = False
# save config
hostname = self.myframe.hostname.GetValue()
username = self.myframe.username.GetValue()
password = self.myframe.password.GetValue()
tomcathome = self.myframe.tomcat.GetValue()
command1 = self.myframe.command1.GetValue()
command2 = self.myframe.command2.GetValue()
projdir = self.myframe.proj.GetValue()
maven_home = self.myframe.maven.GetValue()
myconf = MyConfig(hostname=hostname, username=username, password=password,
projdir=projdir, mavendir=maven_home, tomcatdir=tomcathome,
command1=command1, command2=command2)
# 先更新模块的配置
self.myframe.ChangeConfig(myconfig=myconf)
# 然后同步到本地配置文件中
saveConfig(myconfig=myconf)
errmsg = ''
try:
# 先本地编译
if not maven_home:
exe_command = 'cd /d %s && mvn clean && mvn compile' % projdir
else:
mvn_full = os.path.join(maven_home, 'bin', 'mvn')
exe_command = 'cd /d %s && %s clean && %s compile' % (projdir, mvn_full, mvn_full)
_LOGGING.info('#subprocess exe_command start: %s' % exe_command)
# 执行命令,但是捕捉输出
# if os.name == 'nt':
# _LOGGING.info('os.name==nt')
# startupinfo = subprocess.STARTUPINFO()
# startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
exresult = subprocess_call(exe_command, shell=True)
# exresult = subprocess_popen(exe_command, shell=True, stdout=subprocess.PIPE)
# out = exresult.stdout.read()
# _LOGGING.info(out)
_LOGGING.info('#subprocess_call result is %s' % exresult)
_LOGGING.info('#subprocess_call exe_command end')
if exresult != 0:
result = False
errmsg = 'execute maven command failure.'
else:
result = ztransfer.main()
except Exception as e:
result = False
errmsg = e.message
self.myframe.buttonEnd = True
self.myframe.buttonResult = result
self.myframe.buttonMsg = errmsg
class CheckThread(Thread):
"""每隔0.5秒检查是否已经完成"""
# ----------------------------------------------------------------------
def __init__(self, myframe):
"""Init Worker Thread Class."""
Thread.__init__(self)
self.myframe = myframe
# ----------------------------------------------------------------------
def run(self):
"""Run Worker Thread."""
# This is the code executing in the new thread.
while not self.myframe.buttonEnd:
time.sleep(0.5)
wx.CallAfter(pub.sendMessage, "update",
msg=(self.myframe.buttonEnd, self.myframe.buttonResult,
self.myframe.buttonMsg))
########################################################################
class MyProgressDialog(wx.Dialog):
"""进度条弹出框"""
# ----------------------------------------------------------------------
def __init__(self):
"""Constructor"""
wx.Dialog.__init__(self, None, title=u"同步进度条", size=(350, 150))
self.count = 0
self.progress = wx.Gauge(self, -1, 19, (20, 50), size=(300, 30))
self.tips = wx.StaticText(self, -1, u'正在同步,请耐心等待几秒钟...')
sizer = wx.BoxSizer(wx.VERTICAL)
sizer.Add(self.progress, 0, wx.EXPAND)
sizer.Add((20, 20), 0, wx.EXPAND)
sizer.Add(self.tips, 0, wx.EXPAND)
self.SetSizer(sizer)
# create a pubsub receiver
pub.subscribe(self.updateProgress, "update")
# ----------------------------------------------------------------------
def updateProgress(self, msg):
"""更新进度条"""
self.count += 1
if msg[0]:
self.Destroy()
if msg[1]:
_LOGGING.info('MessageDialog.upload.success!!!')
wx.MessageDialog(self, u'上传成功了!',
'MessageDialog', wx.ICON_INFORMATION).ShowModal()
else:
_LOGGING.error('MessageDialog.upload.error!!!')
wx.MessageDialog(self, u'上传失败error:%s' % msg[2],
'MessageDialog', wx.ICON_INFORMATION).ShowModal()
elif self.count >= 19:
self.count = 1
self.progress.SetValue(self.count)
class UploadFrame(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None, -1, u'小令自动发布工具')
ico = wx.Icon(zutil.resource_path('resources/main.ico'), wx.BITMAP_TYPE_ICO)
self.SetIcon(ico)
self.buttonEnd = False
self.buttonResult = False
self.buttonMsg = ''
# 创建一个菜单栏
menuBar = wx.MenuBar()
# 创建几个菜单
menu1 = wx.Menu()
menuBar.Append(menu1, '&File')
menu1.Append(-1, "&Open", 'Open new file')
menuItem = menu1.Append(-1, "&Exit", 'Exit System')
# 菜单项绑定事件
self.Bind(wx.EVT_MENU, self.OnCloseMe, menuItem)
menu2 = wx.Menu()
# 创建菜单项MenuItem
menu2.Append(wx.NewId(), '&Copy', 'Copy in status bar')
menu2.Append(wx.NewId(), '&Cut', '')
menu2.Append(wx.NewId(), '&Paste', '')
menu2.AppendSeparator()
menu2.Append(wx.NewId(), '&Options', 'Display Options')
menuBar.Append(menu2, '&Edit') # 在菜单栏上附上菜单
menu3 = wx.Menu()
menuBar.Append(menu3, '&Help')
guideItems = menu3.Append(-1, "&Use Guide", '')
ling01Items = menu3.Append(-1, u"&ling01.sh", '')
ling02Items = menu3.Append(-1, u"&ling02.sh", '')
aboutItem3 = menu3.Append(-1, "&About", '')
# 菜单项绑定事件
self.Bind(wx.EVT_MENU, self.OnGuide, guideItems)
self.Bind(wx.EVT_MENU, self.OnLing01, ling01Items)
self.Bind(wx.EVT_MENU, self.OnLing02, ling02Items)
self.Bind(wx.EVT_MENU, self.OnAbout, aboutItem3)
self.SetMenuBar(menuBar) # 在Frame上面附加菜单
# ----------------------------分割线----------------------------------
# 加载配置文件
myconfig = loadConfig()
panel = wx.Panel(self)
# 首先创建controls
topLbl = wx.StaticText(panel, -1, u'================小令自动发布工具===============')
topLbl.SetFont(wx.Font(18, wx.SWISS, wx.NORMAL, wx.BOLD))
hostLbl = wx.StaticText(panel, -1, u'服务器地址:')
self.hostname = wx.TextCtrl(panel, -1, myconfig.hostname)
usernameLbl = wx.StaticText(panel, -1, u'登录用户名:')
self.username = wx.TextCtrl(panel, -1, myconfig.username)
passwordLbl = wx.StaticText(panel, -1, u'密码:')
self.password = wx.TextCtrl(panel, -1, myconfig.password, style=wx.TE_PASSWORD)
tomcatLbl = wx.StaticText(panel, -1, u'Tomcat目录:')
self.tomcat = wx.TextCtrl(panel, -1, myconfig.tomcatdir)
command1Lbl = wx.StaticText(panel, -1, u'远程脚本1:')
self.command1 = wx.TextCtrl(panel, -1, myconfig.command1)
command2Lbl = wx.StaticText(panel, -1, u'远程脚本2:')
self.command2 = wx.TextCtrl(panel, -1, myconfig.command2)
projLbl = wx.StaticText(panel, -1, u'本地工程目录:')
self.proj = wx.TextCtrl(panel, -1, myconfig.projdir)
mavenbl = wx.StaticText(panel, -1, u'Maven目录(选填):')
self.maven = wx.TextCtrl(panel, -1, myconfig.mavendir)
saveBtn = wx.Button(panel, -1, u'开始发布')
cancelBtn = wx.Button(panel, -1, u'关闭')
# 下面开始布局
# mainSizer是顶级sizer控制所有部件使用box sizer
# 垂直sizer
mainSizer = wx.BoxSizer(wx.VERTICAL)
# boxsizer.Add(btn1, proportion=0, flag=wx.ALL, border=2)
mainSizer.Add(topLbl, 0, wx.ALL, 5)
mainSizer.Add(wx.StaticLine(panel), 0, wx.EXPAND | wx.TOP | wx.BOTTOM, 5)
# addrSizer控制所有地址信息使用gridbag sizer
addrSizer = wx.GridBagSizer(hgap=5, vgap=5)
# sizer.Add(bw, pos=(3,0), span=(1,4), flag=wx.EXPAND)
addrSizer.Add(hostLbl, pos=(0, 0), flag=wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL)
addrSizer.Add(self.hostname, pos=(0, 1), flag=wx.EXPAND)
addrSizer.Add(usernameLbl, pos=(1, 0), flag=wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL)
addrSizer.Add(self.username, pos=(1, 1), flag=wx.EXPAND)
addrSizer.Add(passwordLbl, pos=(2, 0), flag=wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL)
addrSizer.Add(self.password, pos=(2, 1), flag=wx.EXPAND)
addrSizer.Add(tomcatLbl, pos=(3, 0), flag=wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL)
addrSizer.Add(self.tomcat, pos=(3, 1), flag=wx.EXPAND)
addrSizer.Add(command1Lbl, pos=(4, 0), flag=wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL)
addrSizer.Add(self.command1, pos=(4, 1), flag=wx.EXPAND)
addrSizer.Add(command2Lbl, pos=(5, 0), flag=wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL)
addrSizer.Add(self.command2, pos=(5, 1), flag=wx.EXPAND)
addrSizer.Add(projLbl, pos=(6, 0), flag=wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL)
addrSizer.Add(self.proj, pos=(6, 1), flag=wx.EXPAND)
addrSizer.Add(mavenbl, pos=(7, 0), flag=wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL)
addrSizer.Add(self.maven, pos=(7, 1), flag=wx.EXPAND)
# 添加几个实际的空白行
addrSizer.Add((30, 30), pos=(8, 0), span=(1, 2), flag=wx.EXPAND)
addrSizer.AddGrowableCol(1)
# 然后把addrSizer添加到mainSizer中
mainSizer.Add(addrSizer, 0, wx.EXPAND | wx.ALL, 10)
# 按钮放到两边和中间都能伸缩间隔的一行中
btnSizer = wx.BoxSizer(wx.HORIZONTAL)
btnSizer.Add((20, 20), 1)
btnSizer.Add(saveBtn)
btnSizer.Add((20, 20), 1)
btnSizer.Add(cancelBtn)
btnSizer.Add((20, 20), 1)
self.Bind(wx.EVT_BUTTON, self.OnUploadMe, saveBtn)
self.Bind(wx.EVT_BUTTON, self.OnCloseMe, cancelBtn)
mainSizer.Add(btnSizer, 0, wx.EXPAND | wx.BOTTOM, 10)
panel.SetSizer(mainSizer)
# 让框架自适应sizer如果panel改变大小框架会自动调整尺寸
# 同时还能防止框架比panel最小尺寸还小
mainSizer.Fit(self)
mainSizer.SetSizeHints(self)
self.Centre()
self.Show()
def OnCloseMe(self, event):
self.Close(True)
def OnGuide(self, event):
dlg = SketchGuide(self)
dlg.ShowModal()
dlg.Destroy()
def OnLing01(self, event):
dlg = Ling01(self)
dlg.ShowModal()
dlg.Destroy()
def OnLing02(self, event):
dlg = Ling02(self)
dlg.ShowModal()
dlg.Destroy()
def OnAbout(self, event):
dlg = SketchAbout(self)
dlg.ShowModal()
dlg.Destroy()
def OnUploadMe(self, event):
btn = event.GetEventObject()
btn.Disable()
ButtonThread(self).start()
CheckThread(self).start()
dlg = MyProgressDialog()
dlg.ShowModal()
btn.Enable()
def ChangeConfig(self, myconfig):
ztransfer.HOSTNAME = myconfig.hostname
ztransfer.USERNAME = myconfig.username
ztransfer.PASSWORD = myconfig.password
ztransfer.DIR_LOCAL = os.path.join(myconfig.projdir, 'target', 'classes', 'com')
ztransfer.ZIPDIR_SRC = os.path.join(myconfig.projdir, 'target', 'classes', 'com')
ztransfer.ZIPDIR_DEST = myconfig.projdir
if myconfig.tomcatdir.endswith('/'):
myconfig.tomcatdir = myconfig.tomcatdir[:-1]
ztransfer.DIR_REMOTE_CONFIG = myconfig.tomcatdir + '/webapps/ROOT/WEB-INF/classes'
ztransfer.DIR_REMOTE = myconfig.tomcatdir + '/webapps/ROOT/WEB-INF/classes/com'
ztransfer.COMMAND_01 = myconfig.command1
ztransfer.COMMAND_02 = myconfig.command2
def main():
# app = wx.App(redirect=True, filename=tempfile.TemporaryFile().name)
app = wx.App()
UploadFrame()
app.MainLoop()

View File

@@ -1,19 +0,0 @@
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
"""
Topic: sample
Desc :
"""
import examples.zupload as zupload
import logging.config
import commons.util as cutil
import tempfile
# logging.basicConfig(level=logging.DEBUG, filename=tempfile.TemporaryFile().name)
logging.basicConfig(level=logging.INFO,
filename=cutil.userhome_file('ztool.log'),
format='%(asctime)s %(message)s')
# 采用配置文件
# logging.config.fileConfig(cutil.resource_path("resources/logging.conf"))
if __name__ == '__main__':
zupload.main()

View File

@@ -1,37 +0,0 @@
# -*- mode: python -*-
a = Analysis(['main.py'],
pathex=['d:\\tmp\\core-wxpython'],
hiddenimports=[],
hookspath=None,
runtime_hooks=None)
def extra_datas(mydir):
def rec_glob(p, files):
import os
import glob
for d in glob.glob(p):
if os.path.isfile(d):
files.append(d)
rec_glob("%s/*" % d, files)
files = []
rec_glob("%s/*" % mydir, files)
extra_datas = []
for f in files:
extra_datas.append((f, f, 'DATA'))
return extra_datas
# append the 'resources' dir
a.datas += extra_datas('resources')
pyz = PYZ(a.pure)
exe = EXE(pyz,
a.scripts,
a.binaries,
a.zipfiles,
a.datas,
name='main.exe',
debug=False,
strip=None,
upx=True,
console=True , icon='d:\\tmp\\main.ico')

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

View File

@@ -1,20 +0,0 @@
#!/bin/bash
echo '先停止tomcat...'
ps aux |grep tomcat |grep -v 'grep tomcat' |awk '{print $2}'|sudo xargs kill -9
wait
echo '成功停止!开始替换class文件'
cd /usr/local/apache-tomcat-8.0.15/webapps/ROOT/WEB-INF/classes/com
rm -rf winhong/
unzip ling.zip
wait
rm -f ling.zip
echo 'class文件解压替换完成,开始替换配置文件'
cd ..
find . -maxdepth 1 -type f -not -name '*.zip' -print0 | xargs -0 rm
unzip lingconfig.zip
wait
rm -f lingconfig.zip
echo '配置文件解压替换完成'

View File

@@ -1,10 +0,0 @@
#!/bin/bash
echo '开始重启tomcat....'
/usr/local/apache-tomcat-8.0.15/bin/startup.sh
wait
echo '重启成功...'

View File

@@ -1,21 +0,0 @@
[loggers]
keys=root
[handlers]
keys=rotateFileHandler
[formatters]
keys=simpleFormatter
[formatter_simpleFormatter]
format=[%(asctime)s](%(levelname)s)%(name)s : %(message)s
[logger_root]
level=DEBUG
handlers=rotateFileHandler
[handler_rotateFileHandler]
class=handlers.RotatingFileHandler
level=DEBUG
formatter=simpleFormatter
args=('test.log', 'a', 200000, 9)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 91 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 383 KiB

242
make.bat
View File

@@ -1,242 +0,0 @@
@ECHO OFF
REM Command file for Sphinx documentation
if "%SPHINXBUILD%" == "" (
set SPHINXBUILD=sphinx-build
)
set BUILDDIR=build
set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% source
set I18NSPHINXOPTS=%SPHINXOPTS% source
if NOT "%PAPER%" == "" (
set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS%
set I18NSPHINXOPTS=-D latex_paper_size=%PAPER% %I18NSPHINXOPTS%
)
if "%1" == "" goto help
if "%1" == "help" (
:help
echo.Please use `make ^<target^>` where ^<target^> is one of
echo. html to make standalone HTML files
echo. dirhtml to make HTML files named index.html in directories
echo. singlehtml to make a single large HTML file
echo. pickle to make pickle files
echo. json to make JSON files
echo. htmlhelp to make HTML files and a HTML help project
echo. qthelp to make HTML files and a qthelp project
echo. devhelp to make HTML files and a Devhelp project
echo. epub to make an epub
echo. latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter
echo. text to make text files
echo. man to make manual pages
echo. texinfo to make Texinfo files
echo. gettext to make PO message catalogs
echo. changes to make an overview over all changed/added/deprecated items
echo. xml to make Docutils-native XML files
echo. pseudoxml to make pseudoxml-XML files for display purposes
echo. linkcheck to check all external links for integrity
echo. doctest to run all doctests embedded in the documentation if enabled
goto end
)
if "%1" == "clean" (
for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i
del /q /s %BUILDDIR%\*
goto end
)
%SPHINXBUILD% 2> nul
if errorlevel 9009 (
echo.
echo.The 'sphinx-build' command was not found. Make sure you have Sphinx
echo.installed, then set the SPHINXBUILD environment variable to point
echo.to the full path of the 'sphinx-build' executable. Alternatively you
echo.may add the Sphinx directory to PATH.
echo.
echo.If you don't have Sphinx installed, grab it from
echo.http://sphinx-doc.org/
exit /b 1
)
if "%1" == "html" (
%SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html
if errorlevel 1 exit /b 1
echo.
echo.Build finished. The HTML pages are in %BUILDDIR%/html.
goto end
)
if "%1" == "dirhtml" (
%SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml
if errorlevel 1 exit /b 1
echo.
echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml.
goto end
)
if "%1" == "singlehtml" (
%SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml
if errorlevel 1 exit /b 1
echo.
echo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml.
goto end
)
if "%1" == "pickle" (
%SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle
if errorlevel 1 exit /b 1
echo.
echo.Build finished; now you can process the pickle files.
goto end
)
if "%1" == "json" (
%SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json
if errorlevel 1 exit /b 1
echo.
echo.Build finished; now you can process the JSON files.
goto end
)
if "%1" == "htmlhelp" (
%SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp
if errorlevel 1 exit /b 1
echo.
echo.Build finished; now you can run HTML Help Workshop with the ^
.hhp project file in %BUILDDIR%/htmlhelp.
goto end
)
if "%1" == "qthelp" (
%SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp
if errorlevel 1 exit /b 1
echo.
echo.Build finished; now you can run "qcollectiongenerator" with the ^
.qhcp project file in %BUILDDIR%/qthelp, like this:
echo.^> qcollectiongenerator %BUILDDIR%\qthelp\python3-cookbook.qhcp
echo.To view the help file:
echo.^> assistant -collectionFile %BUILDDIR%\qthelp\python3-cookbook.ghc
goto end
)
if "%1" == "devhelp" (
%SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp
if errorlevel 1 exit /b 1
echo.
echo.Build finished.
goto end
)
if "%1" == "epub" (
%SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub
if errorlevel 1 exit /b 1
echo.
echo.Build finished. The epub file is in %BUILDDIR%/epub.
goto end
)
if "%1" == "latex" (
%SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex
if errorlevel 1 exit /b 1
echo.
echo.Build finished; the LaTeX files are in %BUILDDIR%/latex.
goto end
)
if "%1" == "latexpdf" (
%SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex
cd %BUILDDIR%/latex
make all-pdf
cd %BUILDDIR%/..
echo.
echo.Build finished; the PDF files are in %BUILDDIR%/latex.
goto end
)
if "%1" == "latexpdfja" (
%SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex
cd %BUILDDIR%/latex
make all-pdf-ja
cd %BUILDDIR%/..
echo.
echo.Build finished; the PDF files are in %BUILDDIR%/latex.
goto end
)
if "%1" == "text" (
%SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text
if errorlevel 1 exit /b 1
echo.
echo.Build finished. The text files are in %BUILDDIR%/text.
goto end
)
if "%1" == "man" (
%SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man
if errorlevel 1 exit /b 1
echo.
echo.Build finished. The manual pages are in %BUILDDIR%/man.
goto end
)
if "%1" == "texinfo" (
%SPHINXBUILD% -b texinfo %ALLSPHINXOPTS% %BUILDDIR%/texinfo
if errorlevel 1 exit /b 1
echo.
echo.Build finished. The Texinfo files are in %BUILDDIR%/texinfo.
goto end
)
if "%1" == "gettext" (
%SPHINXBUILD% -b gettext %I18NSPHINXOPTS% %BUILDDIR%/locale
if errorlevel 1 exit /b 1
echo.
echo.Build finished. The message catalogs are in %BUILDDIR%/locale.
goto end
)
if "%1" == "changes" (
%SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes
if errorlevel 1 exit /b 1
echo.
echo.The overview file is in %BUILDDIR%/changes.
goto end
)
if "%1" == "linkcheck" (
%SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck
if errorlevel 1 exit /b 1
echo.
echo.Link check complete; look for any errors in the above output ^
or in %BUILDDIR%/linkcheck/output.txt.
goto end
)
if "%1" == "doctest" (
%SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest
if errorlevel 1 exit /b 1
echo.
echo.Testing of doctests in the sources finished, look at the ^
results in %BUILDDIR%/doctest/output.txt.
goto end
)
if "%1" == "xml" (
%SPHINXBUILD% -b xml %ALLSPHINXOPTS% %BUILDDIR%/xml
if errorlevel 1 exit /b 1
echo.
echo.Build finished. The XML files are in %BUILDDIR%/xml.
goto end
)
if "%1" == "pseudoxml" (
%SPHINXBUILD% -b pseudoxml %ALLSPHINXOPTS% %BUILDDIR%/pseudoxml
if errorlevel 1 exit /b 1
echo.
echo.Build finished. The pseudo-XML files are in %BUILDDIR%/pseudoxml.
goto end
)
:end

View File

@@ -1,6 +0,0 @@
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
"""
这个包中是常用的技术实践!
"""

View File

@@ -1,7 +0,0 @@
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
"""
Topic: sample
Desc :
"""