Как я могу создать таблицу в файле DOCX с Python? - PullRequest
1 голос
/ 11 октября 2019

Я пытаюсь отправить выбранные значения из радиокнопок в .docx файл

, импортируя то, что мне нужно, фокус на docx

import tkinter as tk
from docx import Document
main = tk.Tk()

это мои варианты, которые мне нужныПоместите в текстовый документ слева от таблицы, они выступают в качестве вопросов в опросе.

info = ["option 1", "option 2", "option 3", "option 4"
         ]

Здесь я размещаю радиокнопки Yes, No & N/A, которые являются ответами на варианты слева (списокinfo выше), а также Label для представления вариантов или, другими словами, вопросов ..

vars = []
for idx,i in enumerate(info):
    var = tk.IntVar(value=0)
    vars.append(var)
    lblOption = tk.Label(main,text=i)
    btnYes = tk.Radiobutton(main, text="Yes", variable=var, value=2)
    btnNo = tk.Radiobutton(main, text="No", variable=var, value=1)
    btnNa = tk.Radiobutton(main, text="N/A", variable=var,value=0)
    lblOption.grid(column=0,row=idx)
    btnYes.grid(column=1,row=idx)
    btnNo.grid(column=2,row=idx)
    btnNa.grid(column=3,row=idx)

Вот моя функция: создание документа и сохранение - это самая простая часть. Моя проблема в том, что я запутался в создании стола, который будет иметь;Опции слева (от info) вверху - это заголовки (см. RadioButtons yes, no, & N/a). И выбранные данные, например, если для option 1 я выбрал Нет, то сохраните данные в файл .docx с выбранным (см. Пример внизу страницы в разделе Желаемый вывод).

def send():
    document = Document()
    section = document.sections[0]
    #add table
    table = document.add_table(1, 4)
    #style table
    table.style = 'Table Grid'

    #table data retrived from Radiobuttons
    items = vars.get()

    #populate header row
    heading_cells = table.rows[0].cells
    heading_cells[0].text = "Options"
    heading_cells[1].text = btnYes.cget("text")
    heading_cells[2].text = btnNo.cget("text")
    heading_cells[3].text = btnNa.cget("text")

    for item in items:
        cells = table.add_row().cells
        cells[0].text = #Options
        cells[1].text = #Yes values
        cells[2].text = #No values
        cells[3].text = #N/A values
    #save doc
    document.save("test.docx")

#button to send data to docx file
btn = tk.Button(main, text="Send to File", command= send)
btn.grid()

main.mainloop()

это то, что он открывает:

enter image description here

Вот требуемый вывод:

enter image description here

Число 1 представляет выбранные элементы из приложения tkinter. Но выясню, как изменить его на галочку.

Я немного запутался, где я, я новичок в использовании docx .. пытался прочитать документацию .. издесь я вырыл себе дыру.

1 Ответ

1 голос
/ 12 октября 2019

В вашем текущем коде vars - это список IntVar с. Вы хотите получить каждое значение отдельно вместо vars.get(). Кроме того, при записи в файл docx вам нужны и info, и значения радиокнопок, для отслеживания их обоих вы можете использовать индекс.

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

def send():
    ...
    ... 
    heading_cells[3].text = btnNa.cget("text")

    for idx, item in enumerate(vars):
        cells = table.add_row().cells
        cells[0].text = info[idx]  # gets the option name
        val = item.get()  #radiobutton value
        if val == 2:  # checks if yes
            cells[1].text = "1"
        elif val == 1:   # checks if no
            cells[2].text = "1"
        elif val == 0:   # checks if N/A
            cells[3].text = "1"

    #save doc
    document.save("test.docx")

или вы можете использовать словарь для отображения радиокнопок на ячейки.

valuesCells = {0: 3, 1: 2, 2: 1}  # value of radiobutton: cell to write
                                  # hard to read what's going on though
for idx, item in enumerate(vars):

    cells = table.add_row().cells
    cells[0].text = info[idx]  # gets the option name
    val = item.get()
    cells[valuesCells[val]].text = "1"

#save doc
document.save("test.docx")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...