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
相关产品推荐
相关产品推荐

