tkinter - 为什么我不能在事件处理程序中访问 Tkinter 小部件?
问题描述
我的目标是每次下拉列表选择更改时更新相同的 Label 对象。据我所知,由于闭包,外部环境对象 lblResult 必须可用于事件处理函数 locationChanged()。但在处理程序中,lblResult 始终为 None。我尝试将 lblResult 对象传递给处理程序,在全局事件处理程序中声明 lblResult ,但没有一个起作用。如果有人能解释为什么会这样,我该如何解决它,这将是一个很大的帮助。谢谢。
from tkinter import Label, OptionMenu, StringVar, Tk
root = Tk()
def locationChanged(x):
lblResult.config(text=x) # lblResult is None always
#lblResult = Label(root, text=x).pack() # this works but I want the same Label to be updated
locations=["Select a City...", "Amsterdam,NL", "NewYork,NY,US", "Sydney,NSW,AU", "Toronto,ON,CA"]
selectedLocation = StringVar()
ddlLocation = OptionMenu(root, selectedLocation, *locations, command=lambda x: locationChanged(x)).pack()
lblResult = Label(root, text="").pack()
root.mainloop()
解决方案
尝试这个:
import tkinter as tk
def location_changed(x):
# Show the label
lbl_result.pack()
# Update the widget's text
lbl_result.config(text=x)
root = tk.Tk()
locations = ("Select a City...", "Amsterdam,NL", "NewYork,NY,US", "Sydney,NSW,AU", "Toronto,ON,CA")
selected_location = tk.StringVar()
ddl_location = tk.OptionMenu(root, selected_location, *locations, command=location_changed)
ddl_location.pack()
lbl_result = tk.Label(root, text="")
root.mainloop()
您需要lblResult.pack()
在函数内部调用。另外请确保您不要.pack()
在创建小部件的同一行上调用,否则您可能会遇到此问题。
推荐阅读
- python - 循环代码: {x_(n+1) = x_n * r * (1- x_n)}
- kotlin - Kotlin 递归结构
- laravel-5 - 在 ProfileController.php 中出现错误:在 laravel 5.4 中找不到错误类 'Illuminate\Support\Facades\Input' ...帮我解决这个错误
- bazel - 如何列出 bazel 规则的输出组?
- python - 在特定上下文中使用的位运算符
- vulkan - 带 alpha 分量的纹理在屏幕外渲染:多重采样 renderPass 中的点图案
- flutter - How can I format a local mobile phone number to a international one?
- php - 如何阻止用户注册现有名称 laravel 5.5
- android - 不在 UI 线程上时如何请求权限?
- c# - 当标识字段位于两个单独的列中时,如何检索该特定记录的最新出现?