最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python之http請(qǐng)求模擬器(tk)使用及說(shuō)明

 更新時(shí)間:2026年01月22日 08:55:40   作者:像風(fēng)一樣的男人@  
文章總結(jié)了使用Python和Tkinter創(chuàng)建一個(gè)HTTP請(qǐng)求模擬器的經(jīng)驗(yàn),提供了代碼示例,并鼓勵(lì)讀者參考和支持腳本之家

python之http請(qǐng)求模擬器(tk)

來(lái)看實(shí)例吧

import tkinter as tk
from tkinter import ttk, scrolledtext, messagebox
import requests
from requests.exceptions import RequestException
import json
from datetime import datetime
import re


class RequestSimulator(tk.Tk):
    def __init__(self):
        super().__init__()
        self.title("HTTP請(qǐng)求模擬器")
        self.geometry("800x650")

        self.method_var = tk.StringVar(value="GET")  # 方法選擇

        self.json_tags = {
            "key": "#0066cc",  # 鍵名:藍(lán)色
            "string": "#009933",  # 字符串:綠色
            "number": "#ff6600",  # 數(shù)字:橙色
            "boolean": "#cc00cc",  # 布爾值:紫色
            "null": "#888888",  # null:灰色
            "brace": "#333333",  # 大括號(hào)/中括號(hào):深灰色
            "colon": "#333333",  # 冒號(hào):深灰色
            "comma": "#333333"  # 逗號(hào):深灰色
        }

        self.create_widgets()
        self.init_json_highlight_tags()  # 初始化高亮標(biāo)簽


    def create_widgets(self):
        # 頂部控制區(qū)域
        top_frame = ttk.Frame(self, padding="10")
        top_frame.pack(fill=tk.X, padx=10, pady=5)
        top_frame.columnconfigure(2, weight=1)

        # 請(qǐng)求方法選擇
        method_label = ttk.Label(top_frame, text="請(qǐng)求方法:")
        method_label.grid(row=0, column=0, padx=5, pady=5, sticky="w")

        methods = ["GET", "POST", "PUT", "DELETE"]
        method_menu = ttk.OptionMenu(
            top_frame, self.method_var, methods[0], *methods
        )
        method_menu.grid(row=0, column=1, padx=5, pady=5)

        # URL輸入框(移除StringVar綁定,直接通過(guò)get()獲?。?
        url_label = ttk.Label(top_frame, text="請(qǐng)求URL:")
        url_label.grid(row=0, column=2, padx=5, pady=5, sticky="w")

        self.url_entry = ttk.Entry(
            top_frame, width=100
        )
        self.url_entry.grid(row=0, column=3, padx=5, pady=5, sticky="ew")
        top_frame.columnconfigure(3, weight=2)

        # 發(fā)送按鈕
        send_btn = ttk.Button(
            top_frame, text="發(fā)送請(qǐng)求", command=self.send_request
        )
        send_btn.grid(row=0, column=4, padx=10, pady=5)

        # 中間請(qǐng)求體區(qū)域
        body_frame = ttk.LabelFrame(self, text="請(qǐng)求體(支持JSON格式化)", padding="10")
        body_frame.pack(fill=tk.X, padx=10, pady=5)
        body_frame.columnconfigure(0, weight=1)

        # 請(qǐng)求體文本框(無(wú)StringVar綁定)
        self.body_text = scrolledtext.ScrolledText(
            body_frame, wrap=tk.WORD, height=10
        )
        self.body_text.grid(row=0, column=0, sticky="nsew")

        # 格式化JSON按鈕
        format_btn = ttk.Button(
            body_frame, text="格式化JSON", command=self.format_json
        )
        format_btn.grid(row=1, column=0, padx=5, pady=5, sticky="w")

        # 底部響應(yīng)區(qū)域
        response_frame = ttk.LabelFrame(self, text="響應(yīng)結(jié)果", padding="10")
        response_frame.pack(fill=tk.BOTH, expand=True, padx=10, pady=5)
        response_frame.rowconfigure(0, weight=1)
        response_frame.columnconfigure(0, weight=1)

        # 狀態(tài)提示
        self.status_var = tk.StringVar(value="狀態(tài): 等待請(qǐng)求")
        status_label = ttk.Label(
            response_frame, textvariable=self.status_var, foreground="#333"
        )
        status_label.grid(row=1, column=0, padx=5, pady=2, sticky="w")

        # 響應(yīng)內(nèi)容文本框(保留高亮配置)
        self.response_text = scrolledtext.ScrolledText(
            response_frame, wrap=tk.WORD, state=tk.DISABLED, font=("Consolas", 10)
        )
        self.response_text.grid(row=0, column=0, sticky="nsew")

    def init_json_highlight_tags(self):
        """初始化高亮標(biāo)簽(僅給響應(yīng)體文本框添加)"""
        for tag_name, color in self.json_tags.items():
            self.response_text.tag_configure(tag_name, foreground=color)

    def highlight_json(self, text_widget, json_content):
        """通用JSON高亮方法(僅用于響應(yīng)體)"""
        text_widget.tag_remove("all", "1.0", tk.END)
        text_widget.delete("1.0", tk.END)
        text_widget.insert("1.0", json_content)

        try:
            parsed = json.loads(json_content)
            formatted = json.dumps(parsed, indent=2, ensure_ascii=False)
            text_widget.delete("1.0", tk.END)
            text_widget.insert("1.0", formatted)
            self._tag_json_elements(text_widget, formatted)
        except json.JSONDecodeError:
            pass

    def _tag_json_elements(self, text_widget, json_str):
        """遞歸標(biāo)記JSON元素(內(nèi)部輔助方法)"""

        patterns = [
            ("key", r'"([^"]+)"(?=\s*:)'),
            ("string", r'"([^"]*)"'),
            ("number", r'-?\d+(\.\d+)?([eE][+-]?\d+)?'),
            ("boolean", r'\b(true|false)\b'),
            ("null", r'\b(null)\b'),
            ("brace", r'[{}\[\]]'),
            ("colon", r':'),
            ("comma", r',')
        ]

        for tag_name, pattern in patterns:
            for match in re.finditer(pattern, json_str):
                start = "1.0 + {} chars".format(match.start())
                end = "1.0 + {} chars".format(match.end())
                text_widget.tag_add(tag_name, start, end)

    def format_json(self):
        """格式化JSON"""
        content = self.body_text.get("1.0", tk.END).strip()
        if not content:
            messagebox.showwarning("提示", "請(qǐng)求體為空,無(wú)需格式化")
            return

        try:
            json_data = json.loads(content)
            formatted_json = json.dumps(
                json_data, indent=2, ensure_ascii=False, sort_keys=True
            )
            self.body_text.delete("1.0", tk.END)
            self.body_text.insert("1.0", formatted_json)
        except json.JSONDecodeError as e:
            messagebox.showerror("JSON格式錯(cuò)誤", f"無(wú)法解析JSON:\n{str(e)}")

    def send_request(self):
        """發(fā)送HTTP請(qǐng)求"""
        url = self.url_entry.get().strip()
        method = self.method_var.get()

        body = None
        if method in ["POST", "PUT"]:
            content = self.body_text.get("1.0", tk.END).strip()
            if content:
                try:
                    body = json.loads(content)
                except json.JSONDecodeError:
                    body = content

        try:
            self.status_var.set("狀態(tài): 正在請(qǐng)求...")
            self.update_idletasks()

            start_time = datetime.now()

            if method == "GET":
                response = requests.get(url, timeout=30)
            elif method == "POST":
                response = requests.post(
                    url, json=body if isinstance(body, dict) else None,
                    data=body if not isinstance(body, dict) else None,
                    timeout=30
                )
            elif method == "PUT":
                response = requests.put(
                    url, json=body if isinstance(body, dict) else None,
                    data=body if not isinstance(body, dict) else None,
                    timeout=30
                )
            else:
                response = requests.delete(url, timeout=30)

            duration = (datetime.now() - start_time).total_seconds()
            self.status_var.set(
                f"狀態(tài): 成功 | 狀態(tài)碼: {response.status_code} | 耗時(shí): {duration:.2f}s"
            )
            self.show_response(response)

        except RequestException as e:
            self.status_var.set("狀態(tài): 請(qǐng)求失敗")
            messagebox.showerror("請(qǐng)求錯(cuò)誤", f"無(wú)法連接到URL:\n{str(e)}")
        except Exception as e:
            self.status_var.set("狀態(tài): 未知錯(cuò)誤")
            messagebox.showerror("錯(cuò)誤", f"發(fā)生異常:\n{str(e)}")

    def show_response(self, response):
        """顯示響應(yīng)結(jié)果(保留JSON高亮)"""
        self.response_text.config(state=tk.NORMAL)
        self.response_text.delete("1.0", tk.END)

        try:
            json_data = response.json()
            formatted_json = json.dumps(
                json_data, indent=2, ensure_ascii=False, sort_keys=True
            )
            self.highlight_json(self.response_text, formatted_json)
        except json.JSONDecodeError:
            self.response_text.insert(tk.END, response.text)

        self.response_text.config(state=tk.DISABLED)

    def destroy(self):
        super().destroy()


if __name__ == "__main__":
    app = RequestSimulator()
    app.mainloop()

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python數(shù)據(jù)可視化之聚類圖實(shí)現(xiàn)代碼

    Python數(shù)據(jù)可視化之聚類圖實(shí)現(xiàn)代碼

    聚類分析是數(shù)據(jù)挖掘和機(jī)器學(xué)習(xí)中常用的無(wú)監(jiān)督學(xué)習(xí)方法,用于將數(shù)據(jù)分組為具有相似特征的簇,這篇文章主要介紹了Python數(shù)據(jù)可視化之聚類圖實(shí)現(xiàn)的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-12-12
  • pycharm設(shè)置虛擬環(huán)境與更換鏡像教程

    pycharm設(shè)置虛擬環(huán)境與更換鏡像教程

    這篇文章主要介紹了pycharm設(shè)置虛擬環(huán)境與更換鏡像教程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-09-09
  • 如何用python繪制散點(diǎn)圖

    如何用python繪制散點(diǎn)圖

    這篇文章主要介紹了如何用python繪制散點(diǎn)圖問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • Python數(shù)據(jù)可視化制作全球地震散點(diǎn)圖

    Python數(shù)據(jù)可視化制作全球地震散點(diǎn)圖

    這篇文章主要介紹了Python數(shù)據(jù)可視化制作全球地震散點(diǎn)圖,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下
    2022-08-08
  • 使用Keras建立模型并訓(xùn)練等一系列操作方式

    使用Keras建立模型并訓(xùn)練等一系列操作方式

    這篇文章主要介紹了使用Keras建立模型并訓(xùn)練等一系列操作方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-07-07
  • Python腳本開(kāi)發(fā)漏洞的批量搜索與利用(GlassFish?任意文件讀取)

    Python腳本開(kāi)發(fā)漏洞的批量搜索與利用(GlassFish?任意文件讀取)

    這篇文章主要介紹了Python?開(kāi)發(fā)漏洞的批量搜索與利用(GlassFish?任意文件讀取),主要包括python開(kāi)發(fā)學(xué)習(xí)的意義及測(cè)試漏洞是否存在的步驟,需要的朋友可以參考下
    2022-05-05
  • 圖解Python中淺拷貝copy()和深拷貝deepcopy()的區(qū)別

    圖解Python中淺拷貝copy()和深拷貝deepcopy()的區(qū)別

    這篇文章主要介紹了Python中淺拷貝copy()和深拷貝deepcopy()的區(qū)別,淺拷貝和深拷貝想必大家在學(xué)習(xí)中遇到很多次,這也是面試中常常被問(wèn)到的問(wèn)題,本文就帶你詳細(xì)了解一下
    2023-05-05
  • 一篇文章帶你深入學(xué)習(xí)Python函數(shù)

    一篇文章帶你深入學(xué)習(xí)Python函數(shù)

    這篇文章主要帶大家深入學(xué)習(xí)Python函數(shù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-01-01
  • 如何基于python操作excel并獲取內(nèi)容

    如何基于python操作excel并獲取內(nèi)容

    這篇文章主要介紹了如何基于python操作excel并獲取內(nèi)容,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • 探索Python內(nèi)置數(shù)據(jù)類型的精髓與應(yīng)用

    探索Python內(nèi)置數(shù)據(jù)類型的精髓與應(yīng)用

    本文探索Python內(nèi)置數(shù)據(jù)類型的精髓與應(yīng)用,包括字符串、列表、元組、字典和集合。通過(guò)深入了解它們的特性、操作和常見(jiàn)用法,讀者將能夠更好地利用這些數(shù)據(jù)類型解決實(shí)際問(wèn)題。
    2023-09-09

最新評(píng)論

曲松县| 镇坪县| 阳朔县| 大英县| 湾仔区| 怀柔区| 柳河县| 河池市| 大足县| 班玛县| 辽中县| 印江| 大理市| 承德县| 新源县| 东安县| 拜城县| 老河口市| 凤冈县| 收藏| 安康市| 措美县| 宁都县| 乌海市| 德州市| 泸西县| 临潭县| 安国市| 临城县| 左云县| 乐业县| 湖北省| 吉水县| 甘洛县| 博白县| 顺昌县| 诏安县| 亳州市| 常熟市| 道真| 郧西县|