这个和上一项目的功能是一样的,不过这个用wxpython库实现了界面操作,而且还导入了上个模块中的几个方法和类,因为这个代码基本和上一个项目一样,我就说说这个wxpython功能的实现吧。
看先看代码guiclient.py:
from xmlrpclib import ServerProxy,Fault
from server import Node,UNHANDLED
from client import randomString
from threading import Thread
from time import sleep
from os import listdir
import sys
import wx
HEAD_START = 0.1
SECRET_LENGTH = 100
class ListableNode(Node):
def list(self):
return listdir(self.dirname)
class Client(wx.App):
def __init__(self, url, dirname, urlfile):
super(Client, self).__init__()
self.secret = randomString(SECRET_LENGTH)
n = ListableNode(url,dirname, self.secret)
t = Thread(target=n._start)
t.setDaemon(1)
t.start()
sleep(HEAD_START)
self.server = ServerProxy(url)
for line in open(urlfile):
line = line.strip()
self.server.hello(line)
def updateList(self):
self.files.Set(self.server.list())
def OnInit(self):
win = wx.Frame(None, title="File Sharing Client",size=(400,45))
bkg = wx.Panel(win)
self.input = input = wx.TextCtrl(bkg)
submit = wx.Button(bkg, label="Fetch",size=(80,25))
submit.Bind(wx.EVT_BUTTON, self.fetchHandler)
hbox = wx.BoxSizer()
hbox.Add(input, proportion=1, flag=wx.ALL | wx.EXPAND, border=10)
hbox.Add(submit, flag=wx.TOP | wx.BOTTOM | wx.RIGHT, border=10)
self.files = files =wx.ListBox(bkg)
self.updateList()
vbox = wx.BoxSizer(wx.VERTICAL)
vbox.Add(hbox, proportion=0, flag=wx.EXPAND)
vbox.Add(files, proportion=11, flag=wx.EXPAND | wx.LEFT | wx.RIGHT | wx.BOTTOM , border=10)
bkg.SetSizer(vbox)
win.Show()
return True
def fetchHandler(self, event):
query =self.input.GetValue()
try:
self.server.fetch(query, self.secret)
except Fault,f:
if f.faultCode != UNHANDLED: raise
print "Counldn't find the file",query
def main():
urlfile, directory,url = sys.argv[1:]
client = Client(url, directory, urlfile)
client.MainLoop()
if __name__ == '__main__':
main()
新加的类ListableNode(),主要去实现 返回文件目录中的文件。
然后是客户端类Client, 他和上一个项目的意思一样。重点是wx.APP子类化了Client
接着 updateList类 ,顾名思义,更新列表,把从服务器获得的文件名放到结合中。
之后最主要的OnInit 是这个版本的重点,创建了类Frame的对象,并且定义一些参数,接着是创建面板,然后往窗口上添加一个fetch按钮,并且把fetch按钮绑定到这个self.fetchHander方法上,接着是窗口的布局,其中proportion定义了组件在既定方向上所占空间的比列,是相对的,相对于其他组件,这是为了防止窗口在缩小或扩大的时候各个组件的位置及大小的变化。
flag参数可以使用“|”来产生多个flag组合,主要是决定窗口的边框.
最后定义了事件fetchaHandler方法,获取你输入的值,,再调用服务器中的fetch方法,和更新列表方法,如果没有你输入的文件则会引发异常。