Как отформатировать отображение данных JSON в виджете tkinter.Text? - PullRequest
0 голосов
/ 06 марта 2020

Я создал Python GUI, который позволяет пользователю создавать и сохранять текстовые файлы (технически журнал). В рабочей области (VS Code) я создал файл JSON простых пар ключ / значение (технически словарь); "word": "definition".

Я хочу, чтобы пользователь мог нажимать кнопку, которая открывает окно с виджетом tk.Text, который содержит данные JSON в виде четкого, читабельного и алфавитного списка, но данные выводятся в виде многострочной строки, разделенной одинарными кавычками, без пробелов или новых строк внутри виджета «Текст».

Мой желаемый результат - это доступный только для чтения список пар ключ / значение, по одной на строку, без всего синтаксиса JSON (двойные кавычки, запятые и фигурные скобки). Я не могу найти никакого решения для достижения этого конкретного c предпочтения, и я все еще изучаю возможности JSON данных в программе Python. Если есть более подходящий или настраиваемый метод, я открыт для предложений, но я надеюсь, что есть простая конфигурация для синтаксиса Python, которая определяет способ печати данных в виджете Текст.

Спасибо за любые идеи даны. Я не думаю, что код будет иметь отношение к решению этой проблемы, но при необходимости я могу добавить его.

1 Ответ

1 голос
/ 06 марта 2020

Я бы использовал встроенный модуль json и использовал бы метод dump загруженного файла json или dumps со строкой, как в этом примере:

import json
print(json.dumps({'4': 5, '6': 7}, sort_keys=True, indent=4))

, в результате чего

{
    "4": 5,
    "6": 7
}

https://docs.python.org/3/library/json.html

Таким образом, вместо прямой печати, вы можете передать его через json.dumps и затем добавить результат в Текстовый виджет:

import tkinter as tk
import json

app = tk.Tk()

text = tk.Text(app)

text.pack()

json_val = json.loads('{"a": 5, "b": 7}')

for k in json_val:
    text.insert(tk.END, '{} = {}\n'.format(k,json_val[k]))
text.config(state = tk.DISABLED)
app.mainloop()

Приведенный выше код производит это:

enter image description here

...