Replace tkinter folder picker with PowerShell

This commit is contained in:
2026-08-05 13:20:35 +00:00
parent 8191dabb61
commit 7daa9d0682
+43 -9
View File
@@ -20,6 +20,8 @@ WEB_DIRECTORY = "./js"
try: try:
import os import os
import subprocess
import sys
from aiohttp import web from aiohttp import web
from server import PromptServer from server import PromptServer
@@ -31,18 +33,50 @@ try:
return web.FileResponse(path) return web.FileResponse(path)
@PromptServer.instance.routes.get("/dumas/api/pick_directory") @PromptServer.instance.routes.get("/dumas/api/pick_directory")
async def dumas_pick_directory(_request): async def dumas_pick_directory(request):
try: try:
import tkinter as tk if sys.platform != "win32":
from tkinter import filedialog return web.json_response({"ok": False, "message": "Native folder picker is only available on Windows right now."})
root = tk.Tk() start_path = str(request.query.get("path", "") or "").strip()
root.withdraw() if start_path and not os.path.isdir(start_path):
root.attributes("-topmost", True) start_path = ""
selected = filedialog.askdirectory(
initialdir=str(_request.query.get("path", "") or "") or None ps_lines = [
"Add-Type -AssemblyName System.Windows.Forms",
"$dialog = New-Object System.Windows.Forms.FolderBrowserDialog",
'$dialog.Description = "Select a folder"',
"$dialog.ShowNewFolderButton = $true",
]
if start_path:
escaped = start_path.replace("'", "''")
ps_lines.append(f"$dialog.SelectedPath = '{escaped}'")
ps_lines.extend(
[
"if ($dialog.ShowDialog() -eq [System.Windows.Forms.DialogResult]::OK) {",
" [Console]::OutputEncoding = [System.Text.Encoding]::UTF8",
" Write-Output $dialog.SelectedPath",
"}",
]
) )
root.destroy() command = "; ".join(ps_lines)
result = subprocess.run(
[
"powershell",
"-NoProfile",
"-STA",
"-ExecutionPolicy",
"Bypass",
"-Command",
command,
],
capture_output=True,
text=True,
encoding="utf-8",
errors="replace",
check=False,
)
selected = (result.stdout or "").strip()
if not selected: if not selected:
return web.json_response({"ok": False, "cancelled": True}) return web.json_response({"ok": False, "cancelled": True})
return web.json_response({"ok": True, "path": selected}) return web.json_response({"ok": True, "path": selected})