Кодирование при сохранении в буфер обмена с помощью pyperclip в скрипте tkinter

Я собираю клиент на Python 3.5, который можно использовать для получения выполненных заданий на перевод с сайта. Я решил использовать кнопки, которые копируют переведенный контент в буфер обмена из соображений удобства использования. В зависимости от того, является ли перевод простым текстом или сохранен в файле, кнопки отображают либо «Загрузить», либо «Копировать в буфер обмена».

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

К сожалению, я получаю странные иероглифы, когда имею дело с немецким (такие вещи, как ä, ö и ü), а японский превращается в кашу.

 def retrieveJobs(self):

     availableJobIDs = gengo.getTranslationJobs(status='reviewable')['response']

         text_count = 0
         text_dict = {}
         file_count = 0
         file_dict = {}

         for i in range(len(availableJobIDs)):

         job = gengo.getTranslationJob(id=availableJobIDs[i]['job_id'])['response']['job']

         title = job['slug']
         titleLabel = tk.Label(self, text=title)
         titleLabel.grid(row=i+3, sticky=tk.E)


         if 'file_url_tgt' in job.keys():
                link = job['file_url_tgt']
                file_dict[file_count] = link
                linkButton = tk.Button(self, text='ダウンロード', 
                                       command=lambda file_count=file_count: urllib.request.urlopen(url=file_dict[file_count]))
                linkButton.grid(row=i+3, column=1, sticky=tk.W+tk.E)
                file_count += 1
         else:
                text = job['body_tgt']
                text_dict[text_count] = text
                copyButton = tk.Button(self, text='訳文をコピーする', 
                                       command=lambda text_count=text_count: tk.clipboard_append(text_dict[text_count]))
                copyButton.grid(row=i+3, column=1, sticky=tk.W)
                text_count += 1

Заголовок скрипта помечен

# -*- coding: utf-8 -*-

Однако, когда я нажимаю одну из кнопок, чтобы скопировать текст на японском языке, например

これはどのように動作し、すべての順序のどこに表示する短いテキストです。

(не обращайте внимания на смысл, это тарабарщина) и скопируйте его в файл Word, получившийся текст будет выглядеть так:

これはどのように動作し、すべての順序のどこに表示する短いテキストです。

Как я могу изменить код для правильного отображения японских символов? Как видно из кода, текст хранится в словаре и в этот момент остается неповрежденным. Только когда вытаскиваешь его с помощью pyperclip, становится все забавно.

Я надеюсь, что объяснения достаточно.

Заранее спасибо!


person Vash The Stampede    schedule 12.07.2017    source источник
comment
Python 2.x или 3?   -  person Alastair McCormack    schedule 12.07.2017
comment
Извините, 3,5. Добавлю в описание!   -  person Vash The Stampede    schedule 12.07.2017
comment
# -*- coding: utf-8 -*- только сообщает компилятору python, что ваш исходный код закодирован в utf8.   -  person Gribouillis    schedule 12.07.2017
comment
Спасибо за комментарий! Итак, мне нужно сообщить pyperclip, чтобы он извлекал информацию в UTF-8 отдельно? Как мне это сделать?   -  person Vash The Stampede    schedule 12.07.2017
comment
Привет, @Vash, ты используешь pyperclip? В вашем коде я вижу только clipboard_append()...   -  person Josselin    schedule 12.07.2017
comment
Привет, Жослен. Я действительно пытался реализовать clipboard_append, поскольку он является частью tkinter, но без особого успеха. Я очень быстро перевернул эту часть, но, видимо, я опубликовал промежуточную версию. Спасибо за отзыв!   -  person Vash The Stampede    schedule 13.07.2017


Ответы (1)


Оказывается, мне нужно было только внести небольшую корректировку здесь:

copyButton = tk.Button(self, 
                       text='訳文をコピーする', 
                       command=lambda text_count=text_count: tk.clipboard_append(text_dict[text_count]))

Функционирующая версия выглядит так:

copyButton = tk.Button(self, 
                       text='訳文をコピーする', 
                       command=lambda text_count=text_count: root.clipboard_append(text_dict[text_count]))

Больше никаких причудливых персонажей ни на немецком, ни на японском языках. Другие языки, такие как французский и китайский, также теперь работают.

Еще раз спасибо за вклад! Это очень помогло по-новому взглянуть на код.

person Vash The Stampede    schedule 13.07.2017
comment
root указывает на главный фрейм (через метод tk.Tk()) программы, которая инициируется после определения всех классов. Я решил попробовать привязать метод копирования к разным уровням программы и начал с самого простого, окна root. К моему удивлению, это сработало сразу. - person Vash The Stampede; 25.07.2017