Abaqus 2020与Tkinter窗口启动mainloop后冻结问题求助
问题:Abaqus 2020与Tkinter GUI窗口冻结问题
我在Windows 10上使用Abaqus 2020进行数值模拟,同时用Python 2.7的Tkinter编写了GUI程序。当前遇到的问题:单独运行Tkinter代码一切正常,但启动mainloop()后,Abaqus和Tkinter窗口均出现冻结;若先关闭Abaqus窗口,Tkinter窗口可正常运行。尝试过多种线程相关方案,均未解决问题。
环境配置
- Windows 10
- Abaqus 2020
- Python 2.7
最小复现示例代码
import Tkinter as tk from Tkinter import * # 创建主Tkinter窗口 window = tk.Tk() window.title('TKINTER-mini') # window.attributes("-fullscreen", True) width=1200 window.geometry("1800x1000") # 框架 frame0 = Frame(window, width=width) label_Titel = tk.Label(master=frame0, text ='Test', font=('Aerial 15 bold')) label_Titel.grid(row=0, column = 0) frame0.grid(row=0, column=2, padx=20, pady=20, ipadx = 20, ipady=20) window.mainloop() # window.update()
尝试过的方案
# 方案1 def __init__(self): import threading threading.Thread.__init__(self) def shutdown_ttk_repeat(self): self.mainroot.eval('::ttk::CancelRepeat') self.mainroot.destroy() def __init__(self, parent): self.mainroot = parent # self.mainroot.protocol("WM_DELETE_WINDOW", self.shutdown_ttk_repeat) # self.tabpage() self.root.after(1000, self.refresh()) self.root.mainloop() # 方案2 try: # 若pythonw.exe有XP .manifest文件且未显式销毁根窗口,Tk会崩溃 # 若Tk的该问题被修复,显式销毁步骤可移除 try: gui = gui(window) window.mainloop() finally: window.destroy() except KeyboardInterrupt: pass # 方案3 if __name__ == "__main__": app = simpleapp_tk(window) window.mainloop()
解决方案
Abaqus的Python解释器嵌入在主进程中,直接调用window.mainloop()会阻塞Abaqus的事件循环,导致双方窗口冻结。正确做法是将Tkinter的事件循环放到单独后台线程运行,同时遵守Tkinter的线程安全规则(所有GUI操作必须在创建Tk实例的线程中执行)。
修改后的可运行代码示例:
import Tkinter as tk from Tkinter import * import threading def run_gui(): # 创建主Tkinter窗口 window = tk.Tk() window.title('TKINTER-mini') width=1200 window.geometry("1800x1000") frame0 = Frame(window, width=width) label_Titel = tk.Label(master=frame0, text='Test', font=('Aerial 15 bold')) label_Titel.grid(row=0, column=0) frame0.grid(row=0, column=2, padx=20, pady=20, ipadx=20, ipady=20) # 启动Tkinter事件循环 window.mainloop() # 在后台线程启动GUI gui_thread = threading.Thread(target=run_gui) gui_thread.daemon = True # 设置为守护线程,关闭Abaqus时自动退出 gui_thread.start()
注意事项
- 后续所有Tkinter组件操作必须在
run_gui函数所在线程执行,可通过window.after()方法调度GUI操作,避免线程安全问题。 - 禁止在Abaqus主线程中调用任何Tkinter的GUI方法,否则会导致崩溃或冻结。
内容的提问来源于stack exchange,提问作者JBKingPile
相关产品推荐
相关产品推荐

