You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 21:40:57