初用Python:Tkinter做的Http小工具

来源:互联网 发布:太空软件安卓 编辑:程序博客网 时间:2024/06/07 22:52

博主平时做移动app开发,与服务端交互时常需要单独看看请求结果,嫌打印Log烦,开网页low,于是有了个小工具。

界面用Tkinter做的,发请求用的urllib2,可动态添加参数,暂未处理request header,运行图:





源码:http://download.csdn.net/detail/ober2012/9450126    (python代码可能有点java风格,勿喷。。)

代码不长,都直接贴出来了:

 (1)__init__.py 程序入口,主要是主界面布局逻辑和2个按钮响应函数

#coding=utf8from UiItem import ParamItem, MethodCheckButton, HostBoxfrom Tkinter import *from HttpPerformer import *from urllib import quoteimport threadroot = 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 httplibimport urllibimport urllib2from urllib2 import URLErrorclass 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,希望大神指点


5 1