开发者社区 问答 正文

Tkinter选项菜单有问题

我在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

展开
收起
kun坤 2019-12-27 10:30:31 455 分享 版权
阿里云 AI 助理回答

在你的代码中,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就能正确显示更新后的文件列表了。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答分类:
问答地址: