我在Python中使用Tkinter来获取一个文件夹路径的用户输入(tkint . entry)。当用户单击GUI上的按钮时,此路径将被接受(get.Entry),并创建该路径中的文件列表(os.listdir) 我想要一个下拉菜单选项菜单来显示这个列表。 即使filelist变量是非空的,我当前的代码也不会显示文件列表。为什么会这样? 在代码完全运行之后,我检查了filelist,发现它不是空的。 为什么OptionMenu会将它视为空的呢? 以下是我的代码:
import os
import tkinter as tk
from tkinter import ttk
from IPython.core.debugger import set_trace
filepath = ""
filename = ""
filelist = [""]
root = tk.Tk()
def click():
global filepath, filename, filelist
filepath = e.get()
filelist = os.listdir(filepath)
myLabel = tk.Label(root,text = filelist).pack()
path = tk.StringVar()
e = tk.Entry(root,textvariable = path)
e.pack()
myButton = tk.Button(root, text = "click", command = click).pack()
optionVar = tk.StringVar()
op = tk.OptionMenu(root,optionVar,*filelist)
op.pack()
root.mainloop()
Pic1显示了我的文件夹的内容。 在这里输入图像描述 我发现filelist数组中某些项周围的花括号是由于文件名中的空格造成的。 Pic2显示了脚本的输出。Print(filelist)本身显示空的filelist。 当按下“click”按钮时,标签将打印包含三个项目的文件列表。 但是OptionMenu没有看到这个更新的文件列表。 在这里输入图像描述 问题来源StackOverflow 地址:/questions/59383314/having-trouble-with-tkinter-optionmenu
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
在你的代码中,filelist
变量是在函数click()
中被更新的,但是Tkinter的OptionMenu
不会自动检测到这个变化并更新其选项。当你首次创建OptionMenu
时,它使用的是初始化时给定的空列表[""]
。即使后来你更改了filelist
的内容,OptionMenu
也不会自动反映出这些变化。
为了解决这个问题,你需要在每次用户点击按钮后重新构建OptionMenu
。你可以通过定义一个函数来删除旧的OptionMenu
并创建一个新的来实现这一点。下面是一个修改后的版本你的代码:
import os
import tkinter as tk
from tkinter import ttk
def click():
global filepath, filelist
filepath = e.get()
filelist = os.listdir(filepath)
# 更新OptionMenu
update_option_menu()
def update_option_menu():
# 删除旧的OptionMenu(如果存在)
if hasattr(root, 'optionmenu'):
root.optionmenu.destroy()
# 重新创建OptionMenu
optionVar.set("") # 清空选中的值
root.optionmenu = tk.OptionMenu(root, optionVar, *filelist)
root.optionmenu.pack()
filepath = ""
filelist = []
root = tk.Tk()
path = tk.StringVar()
e = tk.Entry(root, textvariable=path)
e.pack()
myButton = tk.Button(root, text="click", command=click)
myButton.pack()
optionVar = tk.StringVar()
# 初始化时不直接创建OptionMenu,而是通过update_option_menu函数动态创建
update_option_menu() # 首次创建OptionMenu
root.mainloop()
在这个修改后的版本中,我添加了一个update_option_menu
函数,该函数负责销毁旧的OptionMenu
(如果存在)并根据最新的filelist
内容创建一个新的。每当用户点击按钮时,都会调用这个函数来更新下拉菜单的选项。这样,当文件列表改变时,OptionMenu
就能正确显示更新后的文件列表了。