Python 如何修复长时间计算中的Tkinter GUI冻结

Python 如何修复长时间计算中的Tkinter GUI冻结,python,tkinter,Python,Tkinter,我在GUI中有我的按钮和功能,如下所示。运行函数计算X和Y坐标以及颜色值,然后使用matplotlib打印它们。由于计算和绘图需要时间,Tkinter会冻结直到完成。我见过有人使用线程,但我不能真正将其应用到我自己的代码中。我怎样才能阻止特金特冻僵 RUNButton=Button(RUNFrame,text=“RUN”,width=10,style='RUN.TButton',command=lambda:RUN(voidORinc.get()) grid(行=0,列=0,padx=10,ip

我在GUI中有我的按钮和功能,如下所示。运行函数计算X和Y坐标以及颜色值,然后使用matplotlib打印它们。由于计算和绘图需要时间,Tkinter会冻结直到完成。我见过有人使用线程,但我不能真正将其应用到我自己的代码中。我怎样才能阻止特金特冻僵

RUNButton=Button(RUNFrame,text=“RUN”,width=10,style='RUN.TButton',command=lambda:RUN(voidORinc.get())
grid(行=0,列=0,padx=10,ipady=15,pady=5,列span=2)
def运行(包括):
全局变形类型
全球NL
全球EL
全球英语
全球中心
全球牙科
全局dropElementType
全球AXU xx
全局轴应力
全局轴应力
全局轴应力
全球AXU xx
全局轴应变
全球AXU菌株
全球AXU yy
全局axdisp_x
全局axdisp_y
全局分析类型
(ENL、DOFs、DOCs)=分配(NL、deformationType.get())
K=装配刚度(ENL、EL、NL、int(cEntry.get())、int(dEntry.get())、包含)
Fp=集合力(ENL,NL)
向上=装配位移(ENL,NL)
K#u reduced=K[0:DOFs,0:DOFs]#K#u UU
K_UP=K[0:DOFs,DOFs:DOCs+DOFs]
K_PU=K_PU=K[DOFs:DOCs+DOFs,0:DOFs]
K_PP=K[DOFs:DOCs+DOFs,DOFs:DOCs+DOFs]
F=Fp-(K_UP@UP)
Uu=np.linalg.solve(K_约化,F)
Fu=(K_PU@Uu)+(K_PP@Up)
ENL=更新_节点(ENL、Uu、Fu、NL)
(应力×应力×应力×应力×应力×应力×应力×应力×应力×应变×应变×应力×应力×应力×应力×应力×应力×应力×应力×应力×应力×应力×应力×应力×应力×应力×应力×应力×应力×应变×应力×应力×应力×应力×应力×应力×应力×应力×应力×应力×应力×应力×应力×应力×应力×应力×应力×应力×应力
option=analysisType.get()
"""
多边形图
"""
axstress_xx.cla()
轴应力_xy.cla()
axstress_yx.cla()
axstress_yy.cla()
axtrain_xx.cla()
axtrain_xy.cla()
Axtrain_yx.cla()
axtrain_yy.cla()
axdisp_x.cla()
axdisp_y.cla()
如果选项==“多边形”:
应力?归一化=(np.平均值(应力?x,轴=0)-np.平均值(应力?x,轴=0.min())/(np.平均值(应力?x,轴=0.max()-np.平均值(应力?x,轴=0.min())
应力x归一化=(np.平均值(应力x y,轴=0)-np.平均值(应力x y,轴=0.min())/(np.平均值(应力x y,轴=0.max()-np.平均值(应力x y,轴=0.min())
应力归一化=(np.平均值(应力,轴=0)-np.平均值(应力,轴=0.min())/(np.平均值(应力,轴=0.max()-np.平均值(应力,轴=0.min())
应力归一化=(np.平均值(应力,轴=0)-np.平均值(应力,轴=0.min())/(np.平均值(应力,轴=0.max()-np.平均值(应力,轴=0.min())
应变归一化=(np.平均值(应变xx,轴=0)-np.平均值(应变xx,轴=0.min())/(np.平均值(应变xx,轴=0.max()-np.平均值(应变xx,轴=0.min())
应变xy归一化=(np.平均值(应变xy,轴=0)-np.平均值(应变xy,轴=0.min())/(np.平均值(应变xy,轴=0.max()-np.平均值(应变xy,轴=0.min())
应变归一化=(np.平均值(应变,轴=0)-np.平均值(应变,轴=0.min())/(np.平均值(应变,轴=0.max()-np.平均值(应变,轴=0.min())
应变归一化=(np.平均值(应变,轴=0)-np.平均值(应变,轴=0.min())/(np.平均值(应变,轴=0.max()-np.平均值(应变,轴=0.min())
disp_x归一化=(np.mean(abs(disp_x),axis=0)-np.mean(abs(disp_x,axis=0.min())/(np.mean(abs(disp_x),axis=0.max()-np.mean(abs(disp_x,axis=0.min())
disp_y标准化=(np.mean(abs(disp_y),axis=0)-np.mean(abs(disp_y,axis=0).min()/(np.mean(abs(disp_y,axis=0).max()-np.mean(abs(disp_y,axis=0).min())
补丁=[]
对于范围内的i(len(应力xxu)):
verts=np.hstack([np.array([X[:,i]]).T,np.array([Y[:,i]]).T])
多边形=多边形(顶点)
patches.append(多边形)
多边形。设置边颜色(“黑色”)
cmap=plt.get_cmap('jet'))
颜色1=cmap(应力\u xxNormalized)
颜色2=cmap(应力归一化)
colors3=cmap(应力归一化)
颜色4=cmap(应力标准化)
颜色5=cmap(应变×归一化)
颜色6=cmap(应变x归一化)
颜色7=cmap(应变)
颜色8=cmap(应变yyy标准化)
颜色9=cmap(显示规格化)
颜色10=cmap(显示标准化)
collection1=补丁集合(补丁)
collection2=补丁集合(补丁)
collection3=补丁集合(补丁)
collection4=补丁集合(补丁)
collection5=补丁集合(补丁)
collection6=补丁集合(补丁)
collection7=补丁集合(补丁)
collection8=补丁集合(补丁)
collection9=补丁集合(补丁)
collection10=补丁集合(补丁)
axstress_xx.添加_集合(集合1)
轴应力?xy.添加?集合(集合2)
axstress\u yx.add\u集合(集合3)
axstress_yy.添加_集合(集合4)
axtrain_xx.添加_集合(集合5)
axtrain_xy.添加_集合(集合6)
axtrain_yx.添加_集合(集合7)
axtrain_yy.添加_集合(集合8)
axdisp_x.add_集合(集合9)
axdisp y.添加集合(集合10)
集合1.设置面颜色(颜色1)
集合2.设置面颜色(颜色2)
集合3.设置面颜色(颜色3)
收集4.设置面部颜色(颜色4)
收集5.设置面部颜色(颜色5)
收集6.设置面部颜色(颜色6)
收集7.设置面部颜色(颜色7)
收藏8.设置面部颜色(颜色8)
集合9.设置面颜色(颜色9)
收集10.设置面部颜色(颜色10)
Button(..., command=run_calculations)

def run_calculations():
    
    t = threading.Thread(taget=RUN, args=(voidORinc.get(), cEntry.get()) , int(dEntry.get(), ...))
    t.start()
    
 def RUN(inclusion):

     # ... some part of code ...

     root.update()

     # ... some part of code ...

     root.update()

     # ... some part of code ...

     root.update()