@Pr0max

Не передаются данные eel, что делать?

У меня проект на питоне на библиотеке eel, хочу сделать очистку загрузок с интерфейсом (для себя), я попытался открыть askdirectory() когда нажмется кнопка, ничего не получилось не понятно почему, вот код:
python:
from tkinter.filedialog import askdirectory
from getpass import getuser

import eel

eel.init("web")

downloadsPath = f"C:/Users/{getuser()}/Downloads"


@eel.expose
def downdir():
    path = askdirectory()
    return path


@eel.expose
def defaultPath():
    return downloadsPath


eel.start("index.html", size=(500, 800), mode="chrome")

HTML:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <link rel="stylesheet" href="style.css">
    <title>Home</title>
    <script src="eel.js"></script>
</head>
<body>
<div id="tdl">Папка загрузки</div>
<button id="dl">Выбрать</button>
<div id="tpd">path</div>

<script src="main.js"></script>
</body>
</html>

JS:
async function defaultPath(){
    let path = await eel.defaultPath()();

    document.getElementById('tpd').textContent = path;
}

defaultPath();


async function downloadsDir(){
    let dpath = await eel.downdir()();
    return await dpath;
}


document.querySelector('#dl').onclick = () => {
    let path = downloadsDir();
    document.getElementById('tpd').textContent = path;
    console.log("+")
}
  • Вопрос задан
  • 163 просмотра
Пригласить эксперта
Ответы на вопрос 1
The_Sketch
@The_Sketch
Веб разработчик x)
Проблема возникает из-за того, что вызов askdirectory() блокирует выполнение программы до тех пор, пока пользователь не выберет папку. Однако в вашем коде используется асинхронный JavaScript, поэтому нужно использовать асинхронную версию askdirectory().

Для этого можно использовать библиотеку aioify для превращения синхронных функций в асинхронные. Также нужно обновить метод downdir() для использования асинхронной версии askdirectory().
from tkinter.filedialog import askdirectory
from getpass import getuser

import eel
from aioify import aioify


eel.init("web")

downloadsPath = f"C:/Users/{getuser()}/Downloads"

# Превращаем функцию askdirectory() в асинхронную
async_askdirectory = aioify(askdirectory)


@eel.expose
async def downdir():
    # Используем асинхронную версию askdirectory()
    path = await async_askdirectory()
    return path


@eel.expose
def defaultPath():
    return downloadsPath


eel.start("index.html", size=(500, 800), mode="chrome")

async function defaultPath(){
    let path = await eel.defaultPath()();

    document.getElementById('tpd').textContent = path;
}

defaultPath();


async function downloadsDir(){
    let dpath = await eel.downdir()();
    return await dpath;
}


document.querySelector('#dl').onclick = async () => {
    let path = await downloadsDir();
    document.getElementById('tpd').textContent = path;
    console.log("+")
}

Теперь вызов askdirectory() не блокирует выполнение программы, и вы можете выбрать папку в диалоговом окне.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы