tkinter root.withdraw 后使用root.wm_deiconify显示,进度条结束后不能自动退出

tkinter

我是在自己程序里几个地方都加了TKinter 进度条或者message box 之类的。
下面先提示“请在Group列中输入NG 或者 OK”。
然后用dispatch 从excel打开一个excel表格,用户输入完保存后, 弹出message box“确认输入完成”,withdraw 之后用root.wm_deiconify()重新显示root,因为还有进度条, 运行结束关掉进度条之后,python 一直显示还在运行没有退出,试了。root.quit(),root.destroy都退不了
python 前面3个黄标提示
“local viable mb/wb/mb1 is assigned but never used ”

    root = tkinter.Tk() #https://www.jb51.net/article/183820.htm 
    root.title('Step 1 of 4') # 设置窗口标题
    root.geometry('300x140+600+300')
    root.withdraw() 
    
    EE.message_box('ok','请在Group列中输入NG 或者 OK') 
    EE.open_csv(os.path.join(configdir02,'fileGroup1.csv'))
    root.wm_deiconify()
    pb = ttk.Progressbar(root, length =200, maximum = 100)
    pb.pack(padx=10,pady=20)#pb.grid(row = 0, column = 1)   
    
    def start():
        global mergeSingleV,mergeStableV,mergeSingleM,mergeSingleMStep,mergeStableM,mergeOther        

        #mergeOther = EE.creat_df(mergeOther)
        for i in range(0,len(files)):
            print(files[i])  
            tracepath = os.path.join(tracedir,files[i])                           
            data = pd.read_csv(tracepath,index_col= False) 
            data['Filename'] = files[i]
            data = data.merge(configP[['Par','AnalyClass']],on ='Par', how='left') 
            data = data.merge(configS[['Par','Step','AnalyClass']], on=['Par','Step'],how='left') # AnalyClass_x, AnalyClass_y 
            data['Class'] = np.where(data['AnalyClass_x'].notnull(), data['AnalyClass_x'], data['AnalyClass_y'])# Bug here AnalyClass_y failed                    
            singleV = data[data['Class']==1].drop(['AnalyClass_x','AnalyClass_y'],axis=1) # only ok4 file?
            stableV = data[data['Class']==2].drop(['AnalyClass_x','AnalyClass_y'],axis=1) # dplyr::filter(data, class==2)[,1:5]
            singleM = data[data['Class']==3].drop(['AnalyClass_x','AnalyClass_y'],axis=1) 
            singleMStep = data[data['Class']==4].drop(['AnalyClass_x','AnalyClass_y'],axis=1) #?? 空
            stableM = data[data['Class']==5].drop(['AnalyClass_x','AnalyClass_y'],axis=1) 
            other = data[data['Class'].isnull()].drop(['AnalyClass_x','AnalyClass_y'],axis=1) 
            
            mergeSingleV = mergeSingleV.append(singleV) # <- rbind(mergeSingleV,singleV)# cbind() 把矩阵横向合并成一个大矩阵(列方式),而rbind()是纵向合并(行方式)。
            mergeSingleV[['Step','Interval']] = mergeSingleV[['Step','Interval']].astype(float)
            mergeStableV = mergeStableV.append(stableV) #keep data width and data columns the same for appending
            mergeSingleM = mergeSingleM.append(singleM) #Filename 
            mergeSingleMStep = mergeSingleMStep.append(singleMStep)# Last column:Filename not Class
            mergeStableM = mergeStableM.append(stableM) 
            mergeOther = mergeOther.append(other)            
            print(files[i])#print(tracepath)

            pb['value'] += 100/len(files)
            print(pb['value'])
            pb.update() # 更新画面
            
    bnt = ttk.Button(root, text = 'start',command= start)#bnt2 = ttk.Button(root, text="Quit", command=quit)
    bnt.pack(pady=10) #bnt.grid(row = 0, column = 0)#bnt2.grid(row = 1, column = 1)
    
    root.mainloop() #启动应用程序,启动消息循环    
    root.destroy()

image.png
image.png
image.png

阅读 4k
1 个回答
  1. messagebox 依赖于 window,如果你没有 window,它就会自动创建一个空窗口。空窗口应该是无法关闭的,除非你先关闭 messagebox 的窗口,解决方法一:先创建一个窗口,但用 window.withdraw() 隐藏它,再调用 messagebox;方法二:不使用 messagebox,自己用窗口去模拟它的行为,添加几个组件也很简单。
  2. Kernel died 一般是环境有点乱,依赖包之间存在冲突之类的,检查下 spyder 有没有什么 Log 可以查查。
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏