Replace tkinter folder picker with PowerShell
This commit is contained in:
+43
-9
@@ -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})
|
||||||
|
|||||||
Reference in New Issue
Block a user