如何将Tkinter输入变量传入requests.get()拼接API请求URL
代码修改方案
你的代码存在4个核心问题,直接按下面的方案修改即可实现需求:
- 变量作用域错误:Entry组件e1/e2/e3是window函数的局部变量,外部的d函数无法直接访问
- Entry取值方式错误:不能直接用Entry对象拼接字符串,需要调用
.get()方法获取用户输入的内容 - 字符串格式化逻辑错误:原代码将格式化操作写在requests.get()的括号外侧,相当于对请求返回的response对象做格式化,完全不符合预期
- 冗余的多进程逻辑:Tkinter GUI必须运行在主进程的主线程中,用Process单独启动GUI会导致组件访问异常
修改后的完整代码
import requests import threading from tkinter import Tk, Label, Entry, Button, E def d(v1, v2, v3): # 如果你需要的是拼接成路径形式比如 https://google.com/202122,用下面这行 # url = f"https://google.com/{v1}{v2}{v3}" # 如果你需要的是原代码的带query参数的请求地址,用下面这行 url = f"myserverip/send.php?host=e2<eq>#%s#&port=e2<eq>#%s#&time=e3<eq>#%s#&method=udp" % (v1, v2, v3) response = requests.get(url) print(response.text) def window(): window = Tk() window.title("tools") window.geometry("530x240") Label(window, text="1").grid(row=0) Label(window, text="2").grid(row=1) Label(window, text="3").grid(row=2) e1 = Entry(window) e2 = Entry(window) e3 = Entry(window) e1.grid(row=0, column=1) e2.grid(row=1, column=1) e3.grid(row=2, column=1) # 点击按钮时先取输入框值,再传给线程 def run_task(): v1 = e1.get().strip() v2 = e2.get().strip() v3 = e3.get().strip() threading.Thread(target=d, args=(v1, v2, v3)).start() Button(window, text='DOREQUEST', bg="gray", fg="white", command=run_task).grid(row=3, column=1, sticky=E, pady=30) # 原代码的frame_label未定义,先注释掉 # frame_label.place(x=210, y=0) window.mainloop() # 直接在主进程运行GUI即可,不需要额外开Process if __name__ == "__main__": window()
关键修改说明
- 新增了按钮点击时的取值逻辑,调用
.get()方法从Entry组件拿到用户输入的文本,去除空白后传给后台请求线程 - 修正了URL格式化逻辑,先拼接完完整的请求地址再传入requests.get()方法
- 把请求逻辑和GUI逻辑拆分,避免多线程直接操作GUI组件导致的安全问题
- 移除了冗余的Process子进程启动逻辑,Tkinter GUI直接运行在主进程即可避免各种组件访问异常
内容的提问来源于stack exchange,提问作者finix
相关产品推荐
相关产品推荐

