- 论坛徽章:
- 0
|
想作1个类winscp,目前只作出1个通过sftp浏览远程服务器的界面,如有希望,继续无谓的努力:
1. 看看sort怎么折腾
2. 加几个菜单选项
==========================================================
import wx
import sys,glob,random,os,re
import paramiko
import socket,stat,time
import _winreg as winreg
import traceback,StringIO
def sftp(host,user,passwd,port=22):
mysock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
mysock.settimeout(None)
mysock.connect((host,port),)
myssh = paramiko.Transport(mysock)
myssh.set_keepalive(60)
try:
myssh.connect(username=user,password=passwd)
except paramiko.AuthenticationException,r:
print "paramiko.AuthenticationException: ",r
mysftp = myssh.open_sftp_client()
return mysock,myssh,mysftp
def isdir(sftp,src):
return stat.S_ISDIR(sftp.stat(src).st_mode)
def dealicon(iconfile,width=16,height=16):
'''
# 由于icon和bmp不能进行大小变化, 需要icon->bmp->image->bmp 才可;
'''
tmpimage = wx.ImageFromBitmap(wx.BitmapFromIcon(wx.Icon(iconfile,wx.BITMAP_TYPE_ICO)))
tmpimage = tmpimage.Scale(width,height)
bmp = wx.BitmapFromImage(tmpimage)
return bmp
def listrdir(sftp,dirname='.'):
dirname = dirname.strip()
lists = sftp.listdir_attr(dirname)
#basedir = sftp.getcwd()
columnlist = []
columndesc = ['filename','size','last modify time','rights','owner','group',]
c_filename = None
c_size = None
c_atime = None
c_rights = None
c_owner = None
c_group = None
for l in lists:
c_filename = l.filename
if isdir(sftp,'%s/%s' %(dirname,c_filename)):
c_icon = 'c:\windows\system32\\shell32.dll;3' # 文件夹的选用图标文件
else: c_icon = fileimage(c_filename)
c_size = l.st_size
c_atime = l.st_atime
c_rights = l.longname.split()[0]
c_owner = l.longname.split()[2]
c_group = l.longname.split()[3]
columnlist.append(((c_filename,str(c_size),time.ctime(c_atime),c_rights,c_owner,c_group),dealicon(c_icon)))
columnlist.sort()
columnlist.insert(0,(('..','','','','',''),dealicon('c:\windows\system32\\shell32.dll;87'))) # 在顶上插入1条上一级目录选择
return columnlist
def sshclose(sock,ssh,sftp):
sftp.close()
ssh.close()
sock.close()
def fileimage(filename):
fileicon = None
suffix = extrsuffix(filename)
if suffix: fileicon = regicon(suffix)
if not fileicon: fileicon = 'c:\windows\system32\\shell32.dll;0'
return fileicon
def extrsuffix(filename):
m = re.match(r'.*(\.\w+)$',filename)
if m: return m.group(1)
else: return None
def regicon(suffix):
'''
# 通过注册表查找相应文件后缀打开方式
# 1. 通过suffix的default(即''),取得detail file
# 2. 如果detail file存在一个FriendlyTypeName,取该数值;
# 3. 否则取detail file 的DefaultIcon;
# 4. 若该值为%1,表示已注册在classID, 则通过对应的class id找到DefaultIcon;
'''
try:
k1 = winreg.OpenKey(winreg.HKEY_CLASSES_ROOT,suffix)
v1 = winreg.QueryValueEx(k1,'')[0]
k2 = winreg.OpenKey(winreg.HKEY_CLASSES_ROOT,'%s\DefaultIcon' %(v1))
v = winreg.QueryValueEx(k2,'')[0]
if v == '"%1"':
k3 = winreg.OpenKey(winreg.HKEY_CLASSES_ROOT,'%s\CLSID' %(v1))
clsid = winreg.QueryValueEx(k3,'')[0]
k4 = winreg.OpenKey(winreg.HKEY_CLASSES_ROOT,'CLSID\%s\DefaultIcon' %(clsid))
v = winreg.QueryValueEx(k4,'')[0]
else:
try:
k2 = winreg.OpenKey(winreg.HKEY_CLASSES_ROOT,'%s' %(v1))
v = winreg.QueryValueEx(k2,'FriendlyTypeName')[0]
except: pass
v = re.sub(r'(.*),(\d+$)',r'\1;\2',v)
v = re.sub(r'(.*),(-\d+$)',r'\1;0',v)
v = re.sub(r'@{0,1}%SystemRoot%',os.environ['SYSTEMROOT'],v)
return v
except:
t , v, tb = sys.exc_info()
errstr = StringIO.StringIO()
test_tb = traceback.print_exception(t,v,tb,file=errstr)
errstr.close()
return None
class scpdemo(wx.Frame):
def __init__(self):
wx.Frame.__init__(self,None,-1,'report mode test',size=(600,400))
self.list = wx.ListCtrl(self,-1,style=wx.LC_REPORT)
#self.list.AssignImageList(il,wx.IMAGE_LIST_SMALL)
host = '1.1.1.1'
user = 'root'
passwd = 'root'
self.mysock,self.myssh,self.mysftp = sftp(host,user,passwd)
columndesc = ['filename','size','last modify time','rights','owner','group',]
for col,text in enumerate(columndesc):
self.list.InsertColumn(col,text)
rows,imagelist = zip(*listrdir(self.mysftp,'. '))
self.il = wx.ImageList(16,16,True)
for bmp in imagelist: il_max = self.il.Add(bmp)
self.list.AssignImageList(self.il,wx.IMAGE_LIST_SMALL)
i = 0
for item in rows:
#self.list.InsertStringItem(i, item[0])
index = self.list.InsertStringItem(i,item[0])
for col,text in enumerate(item[1:]):
#print type(text)
self.list.SetStringItem(index,col+1,text)
self.list.SetItemImage(index,i,i)
i = i + 1
for i in range(0,len(columndesc)):
self.list.SetColumnWidth(i,wx.LIST_AUTOSIZE)
self.Bind(wx.EVT_CLOSE,self.OnExit)
self.Bind(wx.EVT_LIST_ITEM_DESELECTED, self.OnItemDeselected, self.list)
self.Bind(wx.EVT_LIST_ITEM_SELECTED, self.OnItemSelected, self.list)
self.Bind(wx.EVT_LIST_ITEM_ACTIVATED, self.OnDclicked,self.list)
self.list.Bind(wx.EVT_LEFT_DCLICK,self.anotherdbclicked)
self.itemforchange = None
self.nowdir = '.'
def listchange(self,sdir='.'):
self.list.DeleteAllItems()
self.il.RemoveAll()
rows,imagelist = zip(*listrdir(self.mysftp,sdir))
for bmp in imagelist: il_max = self.il.Add(bmp)
i = 0
for item in rows:
self.list.InsertImageStringItem(i,item[0],i)
for col,text in enumerate(item[1:]):
self.list.SetStringItem(i,col+1,text)
i = i + 1
self.list.Refresh()
def getnowdir(self):
return self.nowdir + '/' + self.itemforchange
def getColumnText(self, index, col):
item = self.list.GetItem(index, col)
return item.GetText()
def OnExit(self,evt):
print self.mysftp,self.myssh, self.mysock
if self.mysftp: self.mysftp.close()
if self.myssh: self.myssh.close()
if self.mysock: self.mysock.close()
self.Destroy()
def resetselect(self):
self.nowitem = None
self.lastitem = None
def OnDclicked(self,evt):
print "double clicked"
self.itemforchange = evt.GetItem().GetText()
if isdir(self.mysftp,self.getnowdir()): # deal with dir
self.nowdir = self.getnowdir()
print "test::: choose is dir, wait to open it ..", self.nowdir
self.listchange(self.nowdir)
else: # deal with file
print "choose if file, do nothing "
pass
def anotherdbclicked(self,evt):
print "another click monitor on self.list"
evt.Skip()
def OnItemSelected(self, event):
self.currentItem = event.m_itemIndex
print ("OnItemSelected: %s, %s, %s, %s\n" %
(self.currentItem,
self.list.GetItemText(self.currentItem),
self.getColumnText(self.currentItem, 1),
self.getColumnText(self.currentItem, 2)))
self.list.SetItemState(self.currentItem,4,4)
'''
wx.LIST_STATE_CUT = 8
wx.LIST_STATE_DONTCARE = 0
wx.LIST_STATE_DROPHILITED = 1
wx.LIST_STATE_FOCUSED = 2
wx.LIST_STATE_SELECTED = 4
'''
def OnItemDeselected(self,event):
pass
app =wx.PySimpleApp()
frame = scpdemo()
frame.Show()
app.MainLoop()
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u1/57278/showart_1944441.html |
|