Ошибка TypeError: cannot unpack non-iterable bool object

Нужна помощь, пишу программу которая будет проверять правописание текста, по данному исходному коду GitHub - proft/pyspelling: Проверка орфографии для укр, рус, анг языков с помощью Яндекс.Спеллера.
Происходит ошибка в которой я не могу разобраться. Нужна помощь.
Исходный код

import os
import requests
from subprocess import Popen, PIPE

ROOT = os.path.abspath(os.path.dirname(__file__))
ICON_OK = os.path.join(ROOT, 'ok.png')
ICON_ERROR = os.path.join(ROOT, 'error.png')
LANG_TRANS = {'ua': 'uk', 'us': 'en', 'ru': 'ru'}


def get_layout():
    """ Get current keyboard layout """

    pipe = Popen("setxkbmap -print | grep xkb_symbols | awk -F'+' '{print $2}'", stdout=PIPE, shell=True)
    layout = pipe.communicate()[0].strip().decode("utf-8")
    return str(layout)


def set_clipboard(text):
    """ Set system clipboard to text """

    xsel_proc = Popen(['xsel', '-bi'], stdin=PIPE)
    xsel_proc.communicate(bytes(text, 'utf-8'))


def get_clipboard():
    """ Get text from system clipboard """

    return os.popen('xsel').read()

if __name__ == '__main__':
    word = get_clipboard()
    params = {'text' == 'get_clipboard()', 'lang' == 'LANG_TRANS[get_layout()]'}
    r = requests.get('https://speller.yandex.net/services/spellservice.json/checkText', params = params)

    if r.status_code == 200:
        if len(r.json()) > 0:
            out = r.json()[0]
            variants = [v for v in out['s']]
            set_clipboard(variants[0])
            os.system('notify-send -i %(icon)s "%(caption)s" "%(text)s"' % {
                'icon': ICON_ERROR,
                'caption': word,
                'text': '\n'.join(variants)
            })
        else:
            os.system('notify-send -i %(icon)s "%(text)s"' % {
                'icon': ICON_OK,
                'text': word
            })

А вот ошибка

"xsel" �� ���� ����७��� ��� ���譥�
��������, �ᯮ��塞�� �ணࠬ��� ��� ������ 䠩���.
Traceback (most recent call last):
  File "C:\Users\User\PycharmProjects\spellchecer\spellchecer.py", line 34, in <module>
    r = requests.get('https://speller.yandex.net/services/spellservice.json/checkText', params = params)
  File "C:\Users\User\PycharmProjects\spellchecer\venv\lib\site-packages\requests\api.py", line 76, in get
    return request('get', url, params=params, **kwargs)
  File "C:\Users\User\PycharmProjects\spellchecer\venv\lib\site-packages\requests\api.py", line 61, in request
    return session.request(method=method, url=url, **kwargs)
  File "C:\Users\User\PycharmProjects\spellchecer\venv\lib\site-packages\requests\sessions.py", line 528, in request
    prep = self.prepare_request(req)
  File "C:\Users\User\PycharmProjects\spellchecer\venv\lib\site-packages\requests\sessions.py", line 456, in prepare_request
    p.prepare(
  File "C:\Users\User\PycharmProjects\spellchecer\venv\lib\site-packages\requests\models.py", line 316, in prepare
    self.prepare_url(url, params)
  File "C:\Users\User\PycharmProjects\spellchecer\venv\lib\site-packages\requests\models.py", line 434, in prepare_url
    enc_params = self._encode_params(params)
  File "C:\Users\User\PycharmProjects\spellchecer\venv\lib\site-packages\requests\models.py", line 97, in _encode_params
    for k, vs in to_key_val_list(data):
TypeError: cannot unpack non-iterable bool object

Помогите пожалуйста!

params = {'text': 'get_clipboard()', 'lang': 'LANG_TRANS[get_layout()]'}

если это должны были быть ключи и значения.

'text' == 'get_clipboard()' это просто false.

Точнее скорее

params = {'text': get_clipboard(), 'lang': LANG_TRANS[get_layout()]}

если вам не просто строку 'get_clipboard()' серверу передать надо.

А как это сделать?
У меня также выходит такая ошибка

“xsel” �� ���� ����७��� ��� ���譥�
��������, �ᯮ��塞�� �ணࠬ��� ��� ������ 䠩���.
“xsel” �� ���� ����७��� ��� ���譥�
��������, �ᯮ��塞�� �ணࠬ��� ��� ������ 䠩���.
“setxkbmap” �� ���� ����७��� ��� ���譥�
��������, �ᯮ��塞�� �ணࠬ��� ��� ������ 䠩���.
Traceback (most recent call last):
File “C:\Users\User\PycharmProjects\spellchecer\spellchecer.py”, line 33, in
params = {‘text’: get_clipboard(), ‘lang’: LANG_TRANS[get_layout()]}
KeyError: ‘’

Думала нужно как-то изменить код, но пока это не помогает.

Причем тут это? :thinking: Вы ж вызывали уже get_clipboard тут.

А в той строке, из-за которой эта ошибка

в оригинале ж и было как я говорил

Самой бы знать причём тут

word = get_clipboard()

Но для чего-то он нужен…
я пробовала искать в интернете ответы на свой вопросы/
Узнать откуда происходит ошибка

Traceback (most recent call last):
  File "C:\Users\User\PycharmProjects\spellchecer\spellchecer.py", line 32, in <module>
    params = {'text': get_clipboard(), 'lang': LANG_TRANS[get_layout()]}
KeyError: ''

Почему-то ему не нравиться это строка…

Я не про это, я просто не понял почему вдруг возник вопрос

Для этого нужно импотирвать модуль clipboard?


Похоже get_layout вернул пустую строку.

У вас какая ОС? setxkbmap, xsel и т.д. это Линуксовые утилиты.

Если нужно из буфера обмена данные брать, то можно эту библиотеку взять pyperclip · PyPI

Ну а вместо LANG_TRANS[get_layout()] можно пока просто написать 'en' или 'ru'.

Вопрос был отправлен в пустоту. В интернете посмотрела и подумала что нужно модуль скачивать. После поняла что это разное и к коду они не имеют никакого значения.

У вас какая ОС? setxkbmap , xsel и т.д. это Линуксовые утилиты.

Вот в чём дело! У меня Windows 10.

А какие нужны утилиты для моей OC

Для буфера обмена лучше взять крассплатформенную библиотеку

Для определения языка по текущей раскладке клавиатуры — хз, я б не делал так сложно, просто ввести как-нибудь (input(), …) 'en' или 'ru' или пока просто в коде написать одно из них. Вам же все равно в итоге наверно надо какое-то другое поведение программы, а не так как автор этой программы хотел.

Я попробую, спасибо за помощь))

Здравствуйте, я тут попробовала и вроде как все получается, хотелось бы чтобы вы проверили.

def get_layout():
    """ Get current keyboard layout """

    pipe = Popen(input(),'ru')
    layout = pipe.communicate()[0].strip().decode("utf-8")
    return str(layout)

вышло вот так. Правильно ли я вас поняла?

Дальше я изменила данный текст, не уверена что правильно

def set_clipboard(text):
    """ Set system clipboard to text """

    pyperclip.copy('')
    print(pyperclip.paste()(bytes(text, 'utf-8')))

И по каким-то причинам от данной строки

def get_clipboard():
    """ Get text from system clipboard """

    return os.popen('xlex').read()

выходит такая ошибка. Можете пожалуйста подсказать что я делаю не так?

Так по поводу xsel было же, выше:

P. S.
И ‘xlex’ не ‘xsel’

Что-то странное.

Я имел в виду например

print('Enter language (en or ru):')
lang = input()
params = {'text': get_clipboard(), 'lang': lang}

или просто

lang = 'ru'

в смысле?

xsel(1): change X selection - Linux man page
https://ostechnix.com/access-clipboard-contents-using-xclip-and-xsel-in-linux/

В смысле вот:

Раз есть pyperclip, то

    return pyperclip.paste()

Спасибо!
А как понять что означает данная ошибка?

"C:\Users\User\PycharmProjects\spellchecer\ok.png" �� ���� ����७��� ��� ���譥�
��������, �ᯮ��塞�� �ணࠬ��� ��� ������ 䠩���.

Что-то подобное не раз выскакивает, не понятно что это значит. Вы когда-нибудь с нечто подобным сталкивались?

Использовать линукс/макос или английскую винду ))
В cmd винды с кодировками разные сложности. Возможно поможет запуск без PyCharm напрямую из cmd, что-то типа python myprogram.py.

Выше

скорее всего написано, что программа xsel не найдена. Похоже тут то же самое, только вместо имени программы почему-то передан путь картинки.

А как это сделать? Может есть видео где это показывают? И что такое
python myprogram.py .? оно наверное как-то помогает выполнить программу?

Наверно для начала надо освоить основы cmd :slight_smile:

Это вызов программы python с параметром myprogram.py (имя файла вашей программы), что должно выполнить питоновскую программу.

Но в зависимости от способа установки питона и библиотек возможно надо запускать как-нибудь по-другому, например, сначала активировать venv/pipenv/poetry/…

Думаю во многих курсах по основам питона в начале показывают как запускать из cmd.

Как вариант еще может поможет Пример создания GUI приложения на Python. PySide2, Poetry, PyCharm

А как можно создать простую программу которая будет проверять орфографию на Python?