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

Python Tkinter if判断失效 按钮触发函数无响应无报错问题

问题核心原因

你的if分支从一开始就不会被触发,这是点击按钮无反应的核心原因,另外代码里还藏了不少拼写、逻辑错误,就算分支触发也会运行异常:

  • 比较对象完全写错:你定义的options是存了所有心情选项的列表,每个if判断里都拿整个列表和单个心情字符串做相等比较,列表永远不可能等于单个字符串,所以所有分支都进不去。下拉菜单的选中值存在提前定义的clicked这个StringVar对象里,要取当前选中值必须调用clicked.get()。
  • 低级拼写错误:Mysterious、White_noise两个分支里把movie_list错写成movie_lsit;Emotional、Scared等多个分支里json.loads()直接传了请求响应对象,没有取响应的.text属性,就算进了分支也会抛类型错误。
  • 组件渲染逻辑混乱:Happy分支里写了['results'][i]['original_title']这种完全错误的取值语法,也没有创建Label组件;Fantasy分支里没定义My_lebel就直接调用pack();所有分支的循环逻辑要么反复覆盖StringVar的值只显示最后一部电影,要么没有做旧结果清理,多次点击会在窗口堆大量重复标签。
  • 冗余代码太多:开头从tokenize、unicodedata、xml.dom导入的内容全程没用到,开头拉取genre列表的代码赋值给df之后也没被调用,都是无效代码。
修正后的完整代码
import json
import tkinter as tk
import requests
import class_object

root = tk.Tk()
root.geometry('400x400')
root.title("Movie chooser based on mood")

# 提前创建结果容器,方便每次点击先清空旧结果
result_frame = tk.Frame(root)
result_frame.pack(pady=10)

clicked = tk.StringVar()
clicked.set("What's your mood?")
options = [
    class_object.Happy.name,
    class_object.Emotional.name,
    class_object.Scared.name,
    class_object.Mysterious.name,
    class_object.Fantasy.name,
    class_object.Curious.name,
    class_object.White_noise.name
]

tk.OptionMenu(root, clicked, *options).pack(pady=10)

def find_movie():
    # 清空上次渲染的结果
    for widget in result_frame.winfo_children():
        widget.destroy()
    selected_mood = clicked.get()
    # 匹配对应心情的电影类型参数
    genre_param = ""
    if selected_mood == class_object.Happy.name:
        genre_param = "Comedy,Adventure,Animation,Family"
    elif selected_mood == class_object.Emotional.name:
        genre_param = "Drama,Romance"
    elif selected_mood == class_object.Scared.name:
        genre_param = "Horror,Thriller"
    elif selected_mood == class_object.Mysterious.name:
        genre_param = "Mystery"
    elif selected_mood == class_object.Fantasy.name:
        genre_param = "Fantasy,Fiction"
    elif selected_mood == class_object.Curious.name:
        genre_param = "Documentary"
    elif selected_mood == class_object.White_noise.name:
        genre_param = "TV movie"
    else:
        tk.Label(result_frame, text="Please select a valid mood first").pack()
        return
    
    # 统一发请求,避免每个分支写重复代码
    resp = requests.get(
        "https://api.themoviedb.org/3/discover/movie",
        params={
            "api_key": "25edbcd94c9f3ff7a7af1c08760aa632",
            "language": "en-US",
            "sort_by": "vote_count.desc",
            "include_adult": "false",
            "include_video": "false",
            "page": "1",
            "with_genres": genre_param,
            "with_watch_monetization_types": "free"
        }
    )
    movie_data = json.loads(resp.text)
    # 渲染前20部电影名称
    for movie in movie_data.get('results', [])[:20]:
        tk.Label(result_frame, text=movie['original_title']).pack(anchor='w')

tk.Button(root, text='Show the list', command=find_movie).pack(pady=5)

if __name__ == '__main__':
    root.mainloop()
修正点说明
  • 把重复的请求逻辑抽成公共代码,不用每个if分支写一遍重复请求,减少拼写错误概率
  • 每次点击按钮先清空结果容器里的旧标签,避免内容重复堆叠
  • 用elif替代平级的多个if,减少不必要的判断开销
  • 修正了所有变量拼写、取值的语法错误
  • 删掉了所有没用的冗余导入、无效变量和无意义语句

内容的提问来源于stack exchange,提问作者Nighttwinkle

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 05:01:11