Python 禁用tkinter菜单选项,直到另一个选项完全执行

Python 禁用tkinter菜单选项,直到另一个选项完全执行,python,tkinter,Python,Tkinter,我正在使用tkinter编写一个简单的脚本,它允许用户通过菜单选项将csv文件加载到数据帧中。选择后,内容将打印到屏幕上。然后,同一菜单下的另一个选项将绘制数据帧。在数据帧实际加载之前,我对如何禁用plot选项感到困惑。到目前为止,我的例子是: import pandas as pd from matplotlib import pyplot as plt from tkinter import Tk, filedialog,Menu root = Tk() def _open():

我正在使用tkinter编写一个简单的脚本,它允许用户通过菜单选项将csv文件加载到数据帧中。选择后,内容将打印到屏幕上。然后,同一菜单下的另一个选项将绘制数据帧。在数据帧实际加载之前,我对如何禁用plot选项感到困惑。到目前为止,我的例子是:

import pandas as pd
from matplotlib import pyplot as plt
from tkinter import Tk, filedialog,Menu

root = Tk()

def _open():
    root.filename = filedialog.askopenfilename(initialdir = "Users/fishbacp/Desktop",title = "Select file",filetypes = (("csv","*.csv"),("all files","*.*")))
    df=pd.read_csv(root.filename)
    print(df)

def _plotdf():
    df.plot()
    plt.show()

def _quit():
    root.quit()
    root.destroy()

menubar = Menu(root)
filemenu = Menu(menubar, tearoff=0)
filemenu.add_command(label="Open", command=_open)
filemenu.add_command(label="Plot", command=_plotdf) 
filemenu.add_command(label="Exit", command=_quit)
menubar.add_cascade(label="Options", menu=filemenu)
root.config(menu=menubar)

root.mainloop()  
我意识到

filemenu.entryconfig('Plot',state='disabled') 

将禁用绘图按钮。但我不清楚它是否可以用于我的目的。

你可以试试这个。由于打印功能仅在加载dataframe后调用,因此菜单选项在加载后启用和禁用

import pandas as pd
from matplotlib import pyplot as plt
from tkinter import *
from tkinter import filedialog


root = Tk()

def _open():
    root.filename = filedialog.askopenfilename(initialdir = "Users/fishbacp/Desktop",title = "Select file",filetypes = (("csv","*.csv"),("all files","*.*")))
    global df
    df=pd.read_csv(root.filename)
    print(df)
    filemenu.entryconfig("Open",state="disabled")#==Disable Menu Option
    filemenu.entryconfig("Plot",state="normal")#==Enable Menu Option

def _plotdf():
    
    df.plot()
    plt.show()
    filemenu.entryconfig("Plot",state="disabled")#==Disable Menu Option
    filemenu.entryconfig("Open",state="normal")#==Enable Menu Option
    

def _quit():
    root.quit()
    root.destroy()

menubar = Menu(root)
filemenu = Menu(menubar, tearoff=0)
filemenu.add_command(label="Open", command=_open)
filemenu.add_command(label="Plot", command=_plotdf) 
filemenu.entryconfig("Plot",state="disabled") #==Disable Menu Option
filemenu.add_command(label="Exit", command=_quit)
menubar.add_cascade(label="Options", menu=filemenu)
root.config(menu=menubar)

root.mainloop()  

你可以试试这个。由于打印功能仅在加载dataframe后调用,因此菜单选项在加载后启用和禁用

import pandas as pd
from matplotlib import pyplot as plt
from tkinter import *
from tkinter import filedialog


root = Tk()

def _open():
    root.filename = filedialog.askopenfilename(initialdir = "Users/fishbacp/Desktop",title = "Select file",filetypes = (("csv","*.csv"),("all files","*.*")))
    global df
    df=pd.read_csv(root.filename)
    print(df)
    filemenu.entryconfig("Open",state="disabled")#==Disable Menu Option
    filemenu.entryconfig("Plot",state="normal")#==Enable Menu Option

def _plotdf():
    
    df.plot()
    plt.show()
    filemenu.entryconfig("Plot",state="disabled")#==Disable Menu Option
    filemenu.entryconfig("Open",state="normal")#==Enable Menu Option
    

def _quit():
    root.quit()
    root.destroy()

menubar = Menu(root)
filemenu = Menu(menubar, tearoff=0)
filemenu.add_command(label="Open", command=_open)
filemenu.add_command(label="Plot", command=_plotdf) 
filemenu.entryconfig("Plot",state="disabled") #==Disable Menu Option
filemenu.add_command(label="Exit", command=_quit)
menubar.add_cascade(label="Options", menu=filemenu)
root.config(menu=menubar)

root.mainloop()  

如果加载发生在同一个线程中,则不应出现此类问题,因为无论如何都不可能按下该按钮,因为绘图可能会阻塞主循环。我不太确定我是否理解。如前所述,当我在实际打开文件之前选择“绘图”时,上面的代码将抛出一条“Tkinter回调中的异常”消息。(尽管犯了这样的错误,我还是可以打开一个文件。)我想如果我在文件实际加载之前禁用绘图按钮,最终用户会发现它更有用。如果加载发生在同一个线程中,则不应该出现此类问题,因为无论如何都不可能按下该按钮,因为绘图可能会阻塞主循环。我不太清楚我是否理解。如前所述,当我在实际打开文件之前选择“绘图”时,上面的代码将抛出一条“Tkinter回调中的异常”消息。(尽管我犯了这样的错误,但它仍然允许我打开一个文件。)我认为如果我禁用绘图按钮,直到文件实际加载为止,最终用户会发现它更有用。谢谢。我注意到上面的代码显示,当我点击Plot选项时,文件对话框再次打开。有什么方法可以防止这种情况发生吗?尝试将
filemenu.entryconfig
部分移到行
plt.show()
上方,该行没有纠正问题。选择“绘图”时,文件对话框与绘图同时打开。在我的情况下,不会发生这种情况。请尝试将
root.filename
替换为简单的
filename
没问题,一旦您解决了问题,请告诉我。我注意到上面的代码显示,当我点击Plot选项时,文件对话框再次打开。有什么方法可以防止这种情况发生吗?尝试将
filemenu.entryconfig
部分移到行
plt.show()
上方,该行没有纠正问题。选择“绘图”时,文件对话框与绘图同时打开。在我的情况下,不会发生这种情况。尝试将
root.filename
替换为简单的
filename
没有问题,一旦您解决了问题,请告诉我