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

tkinter GUI程序实现Gurobi实时输出弹窗与可控中断需求

Solution for Tkinter GUI with Gurobi Process Management

1. Launch Solver in New CMD Window (with Venv, Auto-Close)

To open a dedicated CMD window that runs your Gurobi solver using the current virtual environment and closes automatically after completion, use subprocess.Popen with the right flags and command sequence:

  • Construct a command that activates the venv first, then runs your solver script.
  • Use CREATE_NEW_CONSOLE to spawn a separate CMD window.
  • Use cmd /c to ensure the window closes once the script finishes.

2. Interrupt Solver Process & Retrieve Latest Results

To mimic PyCharm's single-stop behavior (only halt the solver, not the main GUI), track the solver subprocess and send a Ctrl+C signal when needed. The solver script must handle the interrupt to output/save the latest solution.


Full Example Code

Main Tkinter App (main.py)

import tkinter as tk
from tkinter import ttk
import subprocess
import signal
import os

class App:
    def __init__(self, root):
        self.root = root
        self.root.title("Gurobi Solver Manager")
        self.solver_proc = None

        # UI Elements
        self.run_btn = ttk.Button(root, text="Run Solver", command=self.run_solver)
        self.run_btn.pack(pady=10)

        self.interrupt_btn = ttk.Button(root, text="Interrupt Solver", command=self.interrupt_solver, state=tk.DISABLED)
        self.interrupt_btn.pack(pady=5)

    def run_solver(self):
        # Paths to venv activation and solver script
        venv_activate = os.path.join(os.getcwd(), "venv", "Scripts", "activate.bat")
        solver_script = os.path.join(os.getcwd(), "solver.py")
        
        # Command chain: activate venv → run solver
        cmd = f'cmd /c "{venv_activate} && python {solver_script}"'
        
        # Launch in new console window
        self.solver_proc = subprocess.Popen(
            cmd,
            creationflags=subprocess.CREATE_NEW_CONSOLE
        )
        
        # Update button states
        self.run_btn.config(state=tk.DISABLED)
        self.interrupt_btn.config(state=tk.NORMAL)
        
        # Monitor process completion
        self.root.after(100, self.check_process_status)

    def check_process_status(self):
        if self.solver_proc and self.solver_proc.poll() is not None:
            # Reset UI when solver finishes
            self.run_btn.config(state=tk.NORMAL)
            self.interrupt_btn.config(state=tk.DISABLED)
            self.solver_proc = None
        else:
            self.root.after(100, self.check_process_status)

    def interrupt_solver(self):
        if self.solver_proc:
            try:
                # Send Ctrl+C signal to solver process (Windows-specific)
                os.kill(self.solver_proc.pid, signal.CTRL_C_EVENT)
            except Exception as e:
                print(f"Interrupt error: {e}")

if __name__ == "__main__":
    root = tk.Tk()
    app = App(root)
    root.mainloop()

Solver Script (solver.py)

import time
import sys

def simulate_gurobi_solve():
    latest_result = 0
    try:
        # Simulate Gurobi's iterative solving process
        for i in range(10):
            print(f"Gurobi progress: Iteration {i+1}/10, current best = {i+1}")
            time.sleep(1)
            latest_result = i + 1
        print(f"Solve completed! Final result: {latest_result}")
    except KeyboardInterrupt:
        # Handle interrupt to output latest result
        print(f"\nSolver interrupted. Latest feasible result: {latest_result}")
        # Add code here to save result to file/database for main app to retrieve
        sys.exit(0)

if __name__ == "__main__":
    simulate_gurobi_solve()

Key Notes

  • Venv Handling: The command uses the current directory's venv activation script. Adjust paths if your venv is in a different location.
  • PyInstaller Compatibility: When packing with PyInstaller, include solver.py using --add-data "solver.py;." (Windows) or --add-data "solver.py:." (Linux/macOS). Ensure Gurobi dependencies are bundled correctly.
  • Cross-Platform: For non-Windows systems, replace activate.bat with venv/bin/activate and use signal.SIGINT instead of CTRL_C_EVENT.

内容的提问来源于stack exchange,提问作者diegoperez01

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 16:05:42