如何在Tkinter中构建下拉菜单,按地区选择聊天室发送消息
解决方案
1. 重构聊天室数据结构
先把所有聊天室信息整理成结构化数据,方便后续按地区筛选和获取对应API地址:
# 聊天室信息:包含名称、地区、对应API地址 chatrooms = [ {"name": "Room 1", "region": "东京", "url": "room1.chatroom"}, {"name": "Room 2", "region": "伦敦", "url": "room2.chatroom"}, {"name": "Room 3", "region": "伦敦", "url": "room3.chatroom"}, {"name": "Room 4", "region": "纽约", "url": "room4.chatroom"}, {"name": "Room 5", "region": "纽约", "url": "room5.chatroom"}, {"name": "Room 6", "region": "悉尼", "url": "room6.chatroom"}, ]
2. 添加联动下拉菜单
用Tkinter的OptionMenu实现两个联动下拉框:
- 第一个下拉框选择地区
- 第二个下拉框根据选中的地区动态加载选项(包含「[地区名]全部房间」和该地区的单个房间)
3. 修改消息发送逻辑
根据用户选中的选项,判断是发送给单个房间还是该地区所有房间,循环发送POST请求。
完整代码
import requests import tkinter as tk from tkinter import ttk # 结构化聊天室数据 chatrooms = [ {"name": "Room 1", "region": "东京", "url": "room1.chatroom"}, {"name": "Room 2", "region": "伦敦", "url": "room2.chatroom"}, {"name": "Room 3", "region": "伦敦", "url": "room3.chatroom"}, {"name": "Room 4", "region": "纽约", "url": "room4.chatroom"}, {"name": "Room 5", "region": "纽约", "url": "room5.chatroom"}, {"name": "Room 6", "region": "悉尼", "url": "room6.chatroom"}, ] # 获取所有不重复的地区 regions = sorted(list(set(room["region"] for room in chatrooms))) root = tk.Tk() root.geometry("350x350") root.title(" 消息发送器 ") # 地区选择下拉框 selected_region = tk.StringVar(value=regions[0]) region_label = tk.Label(root, text="选择地区:") region_menu = ttk.OptionMenu(root, selected_region, regions[0], *regions, command=lambda _: update_room_options()) # 房间选择下拉框 selected_room = tk.StringVar() room_label = tk.Label(root, text="选择房间:") room_menu = ttk.OptionMenu(root, selected_room, "") def update_room_options(): """根据选中的地区更新房间选项""" current_region = selected_region.get() # 筛选当前地区的房间 region_rooms = [room["name"] for room in chatrooms if room["region"] == current_region] # 添加「全部房间」选项 options = [f"[{current_region}]全部房间"] + region_rooms # 清空原有菜单并添加新选项 room_menu["menu"].delete(0, "end") for option in options: room_menu["menu"].add_command(label=option, command=tk._setit(selected_room, option)) # 设置默认选中第一个选项 selected_room.set(options[0]) def send_message(): """根据选择发送消息到指定房间""" message = inputtxt.get("1.0", "end-1c") if not message.strip(): print("消息不能为空") return current_selection = selected_room.get() current_region = selected_region.get() # 判断是发送给全部房间还是单个房间 if current_selection.startswith(f"[{current_region}]"): # 发送给该地区所有房间 target_rooms = [room for room in chatrooms if room["region"] == current_region] else: # 发送给单个房间 target_rooms = [room for room in chatrooms if room["name"] == current_selection] # 循环发送请求 for room in target_rooms: try: r = requests.post(url=room["url"], json={"Content": message}) r.raise_for_status() print(f"消息已发送到 {room['name']}") except requests.exceptions.RequestException as e: print(f"发送到 {room['name']} 失败: {str(e)}") # 消息输入区域 input_label = tk.Label(root, text="输入消息内容:") inputtxt = tk.Text(root, height=10, width=30, bg="light yellow") send_btn = tk.Button(root, height=2, width=20, text="发送消息", command=send_message) # 布局组件 region_label.pack(pady=5) region_menu.pack(pady=5) room_label.pack(pady=5) room_menu.pack(pady=5) input_label.pack(pady=5) inputtxt.pack(pady=5) send_btn.pack(pady=10) # 初始化房间选项 update_room_options() root.mainloop()
代码说明
- 结构化的
chatrooms数据让新增/修改聊天室信息更方便,无需修改多处代码 - 联动下拉框通过
update_room_options函数实现,选中地区后自动更新可选房间 - 发送逻辑增加了异常处理,避免单个房间发送失败导致整个流程中断
- 增加了消息为空的判断,防止发送空消息
内容的提问来源于stack exchange,提问作者Kael_1993
相关产品推荐
相关产品推荐

