# -*- coding: utf-8 -*-
__author__ =
'hejunwang'
import wx
import wx.xrc
import wx.aui
import sys
import threading
import os
import time
# from wx.lib.pubsub import Publisher
# 统一使用utf-8格式
default_encoding =
'utf-8'
if sys.getdefaultencoding() != default_encoding:
reload(sys)
sys.setdefaultencoding(default_encoding)
########################################################################
# set the file filter
wildcard1 =
"All files (*.*)|*.*|" \
"Python source (*.py; *.pyc)|*.py;*.pyc"
wildcard2 =
"Python source (*.py; *.pyc)|*.py;*.pyc|" \
"All files (*.*)|*.*"
########################################################################
# threading.thread
CMD_PYTHON =
'python '
class myThread(threading.Thread):
def __init__(
self, threadID, path, counter, window):
threading.Thread.
__init__(
self)
self.threadID = threadID
self.window = window
self.path = path
self.counter = counter
self.timeToQuit = threading.Event()
self.timeToQuit.clear()
def stop(
self):
self.timeToQuit.set()
def run(
self):
print (
'start thread--->') +
self.name
# 更新界面
msg =
"\nTest Starting ... \n"
wx.CallAfter(
self.window.LogMsg, msg)
while self.counter:
execname = CMD_PYTHON +
self.path
os.system(execname)
print u"执行的脚本名称%s" % execname
print (
u'counter time-->%d') %
self.counter
time.sleep(
4)
msg =
"当前执行线程名称-->%s\n执行脚本-->%s:\n执行当前次数-->%s\n" % (
self.threadID,
self.path,
self.counter)
print (
"线程名称-->%s:执行脚本-->%s:执行当前次数-->%s") % (
self.threadID,
self.path,
self.counter)
wx.CallAfter(
self.window.LogMsg, msg)
self.counter -=
1
print 'counter-->',
self.counter
if self.counter ==
0:
exitFlag =
True
wx.CallAfter(
self.window.updatabtn)
if exitFlag:
print (
u'执行完成')
msg =
"执行LogMessage最后一次线程名称-->%s:执行脚本-->%s:执行当前次数-->%s\n" % (
self.threadID,
self.path,
self.counter)
wx.CallAfter(
self.window.LogMsg, msg)
########################################################################
class MyForm(wx.Frame):
# -------------------------------------------------------------------
# set the window layout
def __init__(
self):
wx.Frame.
__init__(
self,
parent=
None,
id=wx.ID_ANY,
title=
u"Python脚本执行",
pos=wx.DefaultPosition,
size=wx.Size(
960,
540),
style=wx.DEFAULT_FRAME_STYLE | wx.TAB_TRAVERSAL)
self.threads = []
self.SetSizeHintsSz(wx.DefaultSize, wx.DefaultSize)
self.m_mgr = wx.aui.AuiManager()
self.m_mgr.SetManagedWindow(
self)
self.m_mgr.SetFlags(wx.aui.AUI_MGR_DEFAULT)
# self.m_panel8 = wx.Panel(self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.TAB_TRAVERSAL)
self.m_panel8 = wx.Panel(
self, -
1)
self.m_mgr.AddPane(
self.m_panel8,
wx.aui.AuiPaneInfo().Center().CaptionVisible(
False).CloseButton(
False).PinButton(
True).Dock().Resizable().FloatingSize(wx.DefaultSize).BottomDockable(
False).TopDockable(
False).LeftDockable(
False).RightDockable(
False).Floatable(
False))
# 绑定窗口的关闭事件
self.Bind(wx.EVT_CLOSE,
self.OnWindowClose)
bSizer6 = wx.BoxSizer(wx.VERTICAL)
bSizer7 = wx.BoxSizer(wx.HORIZONTAL)
self.m_staticText2 = wx.StaticText(
self.m_panel8, wx.ID_ANY,
u"执行文件", wx.DefaultPosition, wx.DefaultSize,
0)
self.m_staticText2.Wrap(-
1)
bSizer7.Add(
self.m_staticText2,
0, wx.ALL,
5)
# 文件路径
self.path_text = wx.TextCtrl(
self.m_panel8, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize,
0)
bSizer7.Add(
self.path_text,
1, wx.ALL,
5)
bSizer6.Add(bSizer7,
0, wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_TOP | wx.EXPAND,
5)
bSizer71 = wx.BoxSizer(wx.HORIZONTAL)
self.m_staticText21 = wx.StaticText(
self.m_panel8, wx.ID_ANY,
u"执行次数", wx.DefaultPosition, wx.DefaultSize,
0)
self.m_staticText21.Wrap(-
1)
bSizer71.Add(
self.m_staticText21,
0, wx.ALL,
5)
# 执行次数
self.count_text = wx.TextCtrl(
self.m_panel8, wx.ID_ANY,
u"1", wx.DefaultPosition, wx.DefaultSize,
0)
self.count_text.SetBackgroundColour(wx.SystemSettings.GetColour(wx.SYS_COLOUR_INFOBK))
bSizer71.Add(
self.count_text,
1, wx.ALL,
5)
bSizer6.Add(bSizer71,
0, wx.EXPAND,
5)
# 文本显示数据
self.result_text = wx.TextCtrl(
self.m_panel8, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize,
wx.HSCROLL | wx.TE_MULTILINE)
bSizer6.Add(
self.result_text,
1, wx.ALL | wx.EXPAND,
5)
bSizer38 = wx.BoxSizer(wx.HORIZONTAL)
self.m_openBtn = wx.Button(
self.m_panel8, wx.ID_ANY,
u"&OPEN", wx.DefaultPosition, wx.DefaultSize,
0)
bSizer38.Add(
self.m_openBtn,
1, wx.ALL,
5)
self.m_startbtn = wx.Button(
self.m_panel8, wx.ID_ANY,
u"&START", wx.DefaultPosition, wx.DefaultSize,
0)
bSizer38.Add(
self.m_startbtn,
1, wx.ALL,
5)
self.m_stopBtn = wx.Button(
self.m_panel8, wx.ID_ANY,
u"&STOP", wx.DefaultPosition, wx.DefaultSize,
0)
bSizer38.Add(
self.m_stopBtn,
1, wx.ALL,
5)
self.m_stopBtn.Disable()
bSizer6.Add(bSizer38,
0, wx.EXPAND,
5)
self.m_panel8.SetSizer(bSizer6)
self.m_panel8.Layout()
bSizer6.Fit(
self.m_panel8)
# 状态栏
self.m_statusBar1 =
self.CreateStatusBar(
1, wx.ST_SIZEGRIP, wx.ID_ANY)
# 将状态栏分割为3个区域,比例为1:2:3
self.m_statusBar1.SetFieldsCount(
2)
self.m_statusBar1.SetStatusWidths([-
1, -
2])
# #设置状态栏1内容
# self.statusbar.SetStatusText(u"鼠标位置:" + str(event.GetPositionTuple()), 0)
#
# #设置状态栏2内容
# self.statusbar.SetStatusText(u"当前线条长度:%s" % len(self.paint.curLine), 1)
self.m_menubar1 = wx.MenuBar()
menu = wx.Menu()
menu1 = wx.Menu()
self.menu_clear = menu.Append(-
1,
u'清除\tCtrl+D')
# 第一个下拉菜单
# 分割线
menu.AppendSeparator()
self.menu_select = menu.Append(-
1,
u'全选(N)\tCtrl+A')
# 快捷键 第二个下拉菜单
self.menu_exit = menu.Append(-
1,
u'退出(N)\tCtrl+Z')
# 快捷键 第二个下拉菜单
self.Bind(wx.EVT_MENU,
self.OnSelect,
self.menu_select)
self.Bind(wx.EVT_MENU,
self.OnMenuClear,
self.menu_clear)
# 绑定事件处理
self.Bind(wx.EVT_MENU,
self.OnWindowClose,
self.menu_exit)
# 绑定事件处理
# 添加到帮助下面
self.menu_help = menu1.Append(-
1,
u"更新版本")
self.Bind(wx.EVT_MENU,
self.OnHelp,
self.menu_help)
# 绑定事件处理
self.m_menubar1.Append(menu,
u'文件(F)')
self.m_menubar1.Append(menu1,
u'帮助(H)')
self.SetMenuBar(
self.m_menubar1)
self.m_mgr.Update()
self.Centre(wx.BOTH)
# Connect Events
self.m_openBtn.Bind(wx.EVT_BUTTON,
self.OPEN)
self.m_startbtn.Bind(wx.EVT_BUTTON,
self.START)
self.m_stopBtn.Bind(wx.EVT_BUTTON,
self.STOP)
# 版本说明
def OnHelp(
self, event):
dialog = wx.MessageDialog(
None,
u"当前版本是V1.0",
u'版本更新', wx.YES_NO | wx.ICON_QUESTION)
retCode = dialog.ShowModal()
if (retCode == wx.ID_YES):
print 'yes'
else:
print 'no'
dialog.Destroy()
def OnWindowClose(
self, event):
print 'closewindows'
self.Destroy()
# 更新按键
def updatabtn(
self):
self.m_startbtn.Enable()
self.m_stopBtn.Disable()
# 停止
def STOP(
self, event):
self.StopThread()
self.uptext()
self.m_startbtn.Enable()
self.m_stopBtn.Disable()
def uptext(
self):
print(
"STOP")
self.result_text.AppendText(
"\nSTOP")
# 停止线程
def StopThread(
self):
while self.threads:
thread =
self.threads[
0]
thread.stop()
self.threads.remove(thread)
# 更新文本显示
def LogMsg(
self, msg):
self.result_text.AppendText(msg)
# menu菜单
def OnSelect(
self, event):
print(
"onSelect")
# self.path_text.SetValue(" ")
# # 文本显示数据
# self.result_text.SetValue(" ")
pass
def OnMenuClear(
self, event):
print "onCLEAR"
self.path_text.SetValue(
" ")
# 文本显示数据
self.result_text.SetValue(
" ")
# 开始
def START(
self, event):
count =
self.count_text.GetValue()
print (
'执行次数-->%s') % count
if self.path_text.GetValue() ==
'':
print "记得选择执行的文件哦!"
else:
print (
'path-->%s') % paths
# 线程名称, 执行的python文件,执行的次数
thread1 = myThread(
'python thread', pathname,
int(count),
self)
self.threads.append(thread1)
thread1.start()
self.m_startbtn.Disable()
self.m_stopBtn.Enable()
def UpdataCtrl(
self):
self.result_text.appendText(
"Worker Threads %s" % (
self.threads))
# 打开对话框
def OPEN(
self, event):
"""
Create and show the Open FileDialog
"""
global paths, pathname
dlg = wx.FileDialog(
self,
message=
"Choose a file",
defaultFile=
"",
wildcard=wildcard1,
style=wx.OPEN | wx.MULTIPLE | wx.CHANGE_DIR
)
if dlg.ShowModal() == wx.ID_OK:
tmp =
""
# paths = dlg.GetPaths()
paths = dlg.GetPaths()
# print "You chose the following file(s):"
for path
in paths:
tmp = tmp + path
# print "tmp路径 %s" %tmp
# set the value of TextCtrl[filename]
self.path_text.SetValue(tmp)
print (
u'textpath---- open-->'), tmp
# 得到文件的名称
pathname = tmp.split(
'\\')[-
1]
# set the value to the TextCtrl[contents]
# file = open(self.m_textCtrl2.GetValue())
# self.m_textCtrl19.SetValue(file.read())
# file.close()
dlg.Destroy()
# Run the program
if __name__ ==
"__main__":
app = wx.App()
frame = MyForm()
frame.Show()
app.MainLoop()