|
|
发表于 2026-9-4 14:06:15
|
显示全部楼层
首先给鱼油点个赞!3.0 版本整体思路清晰,比 2.0 的“小黑框”已经进步不少。不过界面确实还能再打磨,而且代码里有几个容易踩坑的地方。
需要指出几个问题:
- tk.messagebox 的用法不对,正确写法是 from tkinter import messagebox。
- Toplevel 本身依赖一个主窗口(Tk),而你这里没有创建主窗口就直接调用,容易报错。
- 在子窗口里再次调用 mainloop() 会产生嵌套事件循环,可能导致界面卡死。
- easygui 和 tkinter 混搭,风格不统一,体验也比较“破碎”。
下面给你一个“3.1 单窗口版”,全部用 tkinter 实现,输入、查询、结果显示都在同一个窗口里,界面也友好得多:
- import tkinter as tk
- from tkinter import messagebox, scrolledtext
- from pypinyin import lazy_pinyin
- from re import findall
- from requests import get
- def chaxun():
- city = entry.get().strip()
- if not city:
- messagebox.showwarning("提示", "请输入城市名称")
- return
- # 城市名转拼音
- pinyin = "".join(lazy_pinyin(city))
- url = f"[url=https://www.tianqi.com/{pinyin}/"]https://www.tianqi.com/{pinyin}/"[/url]
- headers = {
- "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
- "AppleWebKit/537.36 (KHTML, like Gecko)"
- " Chrome/120.0 Safari/537.36"
- }
- try:
- resp = get(url, headers=headers, timeout=10)
- resp.raise_for_status()
- html = resp.text
- except Exception as e:
- messagebox.showerror("网络错误", f"访问失败:{str(e)}")
- return
- # 提取天气信息(正则按原逻辑保留)
- rq = findall(r"\d\d月\d\d日", html)
- sd = findall(r"湿度:\d\d%", html)
- fx = findall(r"风向:+ \d级", html)
- zwx = findall(r"紫外线:+", html)
- pm = findall(r"PM: \d\d", html)
- def get_one(lst):
- return "、".join(lst) if lst else "未获取"
- result = (
- f"城市:{city}\n"
- f"地址:{url}\n\n"
- f"日期:{get_one(rq)}\n"
- f"湿度:{get_one(sd)}\n"
- f"风向:{get_one(fx)}\n"
- f"紫外线:{get_one(zwx)}\n"
- f"PM:{get_one(pm)}\n"
- )
- txt.delete(1.0, tk.END)
- txt.insert(tk.END, result)
- # 主窗口
- root = tk.Tk()
- root.title("天气查询 3.1")
- root.geometry("450x350")
- # 顶部输入区域
- top = tk.Frame(root)
- top.pack(pady=10)
- tk.Label(top, text="城市:", font=("黑体", 12)).pack(side=tk.LEFT)
- entry = tk.Entry(top, font=("黑体", 12), width=16)
- entry.pack(side=tk.LEFT, padx=5)
- tk.Button(top, text="查询", font=("黑体", 12), command=chaxun).pack(side=tk.LEFT)
- # 中部结果显示框(带滚动条)
- txt = scrolledtext.ScrolledText(root, font=("黑体", 12), wrap=tk.WORD)
- txt.pack(fill=tk.BOTH, expand=True, padx=10, pady=10)
- root.mainloop()
复制代码
这个版本去掉了 easygui,没有多余的弹窗,所有信息都在主窗口展示,操作也更连贯。试着运行看看,如果正则匹配的字段和网页不同,微调一下就行。3.0 已经很强了,继续保持!
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 |
|