您的位置:首页 > 理论基础 > 计算机网络

初用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个按钮响应函数

#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,希望大神指点
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: