You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 11:33:24