初用Python:Tkinter做的Http小工具
2016-03-01 22:52
567 查看
博主平时做移动app开发,与服务端交互时常需要单独看看请求结果,嫌打印Log烦,开网页low,于是有了个小工具。
界面用Tkinter做的,发请求用的urllib2,可动态添加参数,暂未处理request header,运行图:
源码:http://download.csdn.net/detail/ober2012/9450126 (python代码可能有点java风格,勿喷。。)
代码不长,都直接贴出来了:
(1)__init__.py 程序入口,主要是主界面布局逻辑和2个按钮响应函数
MethodCheckBox:
HostBox:
ParamItem:
ps:初用python,希望大神指点
界面用Tkinter做的,发请求用的urllib2,可动态添加参数,暂未处理request header,运行图:
源码:http://download.csdn.net/detail/ober2012/9450126 (python代码可能有点java风格,勿喷。。)
代码不长,都直接贴出来了:
(1)__init__.py 程序入口,主要是主界面布局逻辑和2个按钮响应函数
#coding=utf8 from UiItem import ParamItem, MethodCheckButton, HostBox from Tkinter import * from HttpPerformer import * from urllib import quote import thread root = Tk() root.geometry('600x400') root.title("HttpTester") paramItemList = [] #存储参数控件的列表,以便动态添加 methodBox = MethodCheckButton(root) methodBox.grid(row = 0, column = 0) deleteCount = IntVar() #记录已删除的个数,仅仅为了布局时grid() deleteCount.set(0) """获取所有请求参数""" def getAllParams(): dict = {} for paramItem in paramItemList: k = paramItem.getKey() v = paramItem.getValue() if len(k) > 0: print k, v dict.setdefault(str(k), v.encode("utf8")) return dict """按钮相应函数 ,增加一个参数控件""" def addParam(): currentParamCount = len(paramItemList) newParamItem = ParamItem(root, paramItemList, deleteCount) paramItemList.append(newParamItem) newParamItem.grid(row = currentParamCount + 2 + deleteCount.get(), columnspan = 2) btnAdd = Button(root, text = "Add Param", command = addParam) btnAdd.grid(row = 0, column = 1) hostBox = HostBox(root) hostBox.grid(row = 1, columnspan = 2) """按钮相应函数,异步发起请求""" def perform(): method = methodBox.getCurrentMethod() host = hostBox.getHost() url = hostBox.getUrl() port = hostBox.getPort() param = getAllParams() headers = {} if HttpPerformer.check(method, host, url, port, param, headers): performer = HttpPerformer(method, host, url, port, param, headers) #一个简单的异步处理, Tkinter 对异步支持不好,只能这样啦。 thread.start_new_thread(performer.connect, ()) #轮询请求结果 def pollFunc(): flag = performer.getFlag() if flag == 0 or flag == 1: root.after(1000, pollFunc) elif flag == 2: performer.showResult() elif flag == -1: performer.showResultFail() root.after(1000, pollFunc) btnPerform = Button(root, text = "Perform", command = perform, padx = 3) btnPerform.grid(row = 0, column = 2) root.mainloop()(2)UiItem.py 包装了3个小控件,直接看图:
MethodCheckBox:
HostBox:
ParamItem:
''' Created on 2016-2-17 @author: Administrator ''' from Tkinter import Frame, Label, Entry, Button, Checkbutton, IntVar, StringVar """ 输入参数的控件 """ class ParamItem(Frame): def __init__(self, master, itemList, deleteCount): Frame.__init__(self, master) self.labelKey = Label(self, text = "Key:") self.labelValue = Label(self, text = "Value:") self.entryKey = Entry(self, width = 8) self.entryValue = Entry(self, width = 20) self.deleteCount = deleteCount self.itemList = itemList self.btnDelete = Button(self, text = "delete", \ command = self.__internalDelete, padx = 5) self.__boxComponents() def __boxComponents(self): self.labelKey.grid(row = 0, column = 0) self.entryKey.grid(row = 0, column = 1) self.labelValue.grid(row = 0, column = 2) self.entryValue.grid(row = 0, column = 3) self.btnDelete.grid(row = 0, column = 4) def __internalDelete(self): self.deleteCount.set(self.deleteCount.get() + 1) self.itemList.remove(self) self.destroy() def getKey(self): return self.entryKey.get() def getValue(self): return self.entryValue.get() """选择Get Post的控件""" class MethodCheckButton(Frame): def __init__(self, master): Frame.__init__(self, master, width = 15) self.initComplete = False self.getVar = IntVar() self.postVar = IntVar() self.getCheckButton = Checkbutton(self, \ text = "GET", width = 6, variable = self.getVar, \ command = self.__singleSelectCommandGet, onvalue = 1, offvalue = 0) self.postCheckButton = Checkbutton(self, \ text = "POST", width = 6, variable = self.postVar, \ command = self.__singleSelectCommandPost, onvalue = 1, offvalue = 0) self.label = Label(self, text = "Use Method:", padx = 3) self.__boxComponents() self.initComplete = True def __boxComponents(self): self.label.grid(row = 0, column = 0) self.getCheckButton.grid(row = 0, column = 1) self.postCheckButton.grid(row = 0, column = 2) def __singleSelectCommandGet(self): if self.initComplete == False: return self.postCheckButton.deselect() def __singleSelectCommandPost(self): if self.initComplete == False: return self.getCheckButton.deselect() def getCurrentMethod(self): if self.getVar.get() == 1: return "get" if self.postVar.get() == 1: return "post" return None """输入host url port 的控件""" class HostBox(Frame): def __init__(self, master): Frame.__init__(self, master) self.labelHost = Label(self, text = "Host: http://") self.entryHost = Entry(self, width = 20) self.labelUrl = Label(self, text = "Url:") self.entryUrl = Entry(self, width = 20) self.labelPort = Label(self, text = "Port:") self.port = StringVar() self.port.set("80") self.entryPort = Entry(self, width = 8, textvariable = self.port) self.__boxComponents() def __boxComponents(self): self.labelHost.grid(row = 0, column = 0) self.entryHost.grid(row = 0, column = 1) self.labelUrl.grid(row = 1, column = 0) self.entryUrl.grid(row = 1, column = 1) self.labelPort.grid(row = 0, column = 2) self.entryPort.grid(row = 0, column = 3) def getHost(self): return self.entryHost.get() def getPort(self): return self.port.get() def getUrl(self): return self.entryUrl.get()(3)HttpPerformer.py 发送Http请求的类,并显示结果
''' Created on 2016-2-17 @author: Administrator ''' from Tkinter import * import httplib import urllib import urllib2 from urllib2 import URLError class HttpPerformer: """发起请求之前,简单检查参数""" @staticmethod def check(method, host, url, port, param, header): if method == None: msg = "method is Null !" elif len(host) < 3: msg = "invalid host" elif not port.isdigit(): msg = "invalid port" else: return True root = Tk() Message(root, text = msg).pack() root.mainloop() return False def __init__(self, method, host, url, port, param, header = {}): self.method = method self.host = host self.url = url self.port = port self.param = param self.header = header self.flag = 0 return """显示错误提示""" def showResultFail(self): e = self.e msg = "" try: msg = msg + str(e.code) + "\n" except Exception, e: print(e) try: msg = msg + str(e.reason) + "\n" except Exception, e: print(e) if msg == "": msg = "url open error" root = Tk() root.title("Failed") textShow = Text(root) textShow.insert(INSERT, msg) textShow.pack() self.flag = 0 root.mainloop() """显示成功提示""" def showResult(self): data = self.data msg = str(data) root = Tk() root.title("Result") textShow = Text(root) textShow.insert(INSERT, msg) textShow.pack() self.flag = 0 root.mainloop() """发起请求, 并维护flag的值""" def connect(self): if self.flag == 1: print "is connecting! return!" return self.flag = 1 paramEncoded = None resp = None data = "" if not self.param == None: if len(self.param) > 0: paramEncoded = urllib.urlencode(self.param) try: requestUrl = "http://" + self.host + ":" + str(self.port) if len(self.url) > 0: requestUrl += self.url ##doGet if self.method == "get": if not paramEncoded == None: requestUrl = requestUrl + "?" + paramEncoded req = urllib2.Request(url=requestUrl, headers=self.header) resp = urllib2.urlopen(req) data = resp.read() self.data = data ##doPost else: req = None if not paramEncoded == None: req = urllib2.Request(url=requestUrl, data=paramEncoded, headers=self.header) else: req = urllib2.Request(url=requestUrl, headers=self.header) resp = urllib2.urlopen(req) data = resp.read() self.data = data except URLError, e: print e self.flag = -1 self.e = e return print "success" self.flag = 2 """ flag : 0:prepare 1:connecting 2:success -1:failed""" def getFlag(self): return self.flag
ps:初用python,希望大神指点
相关文章推荐
- Http协议学习笔记
- 深层神经网络
- vm下centos网络配置(转)
- 复杂网络环境模拟工具软件
- TCP/IP状态详解
- http中post 和 get 请求方法区别
- 上下界网络流
- 深度神经网络结构以及Pre-Training的理解
- TCP与UDP的区别
- HTTP中的Host字段
- iOS网络数据安全
- 浏览器XMLHttpRequest案例
- 网络编程Study
- HTTP状态码大全
- JAVA的包装类 http://blog.csdn.net/hjf19790118/article/details/7081925
- TCP/IP基础(二)
- Java泛型的类型擦除 http://blog.csdn.net/hust_is_lcd/article/details/7875386
- 卷积神经网络用于视觉识别Convolutional Neural Networks for Visual Recognition
- 使用AsyncTask异步加载类进行访问网络数据json的理解和用法
- 关于安装Httpd Web服务器