Как сохранить файл DOCX на основе значений, выбранных из tkinter? - PullRequest
1 голос
/ 18 октября 2019

Вот мой код:

from tkinter import *
from docx import Document

root = Tk()



info = ["Option 1", "Option 2", "Option 3"]


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


def save():
    document = Document()

    #add table
    table = document.add_table(1, 4)
    #style table
    table.style = 'Table Grid'

    #populate header row
    heading_cells = table.rows[0].cells
    heading_cells[0].text = "Options"
    heading_cells[1].text = "Yes"
    heading_cells[2].text = "No"
    heading_cells[3].text = "N/a"

    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 = "*"
        elif val == 1:   # checks if no
            cells[2].text = "*"
        elif val == 0:   # checks if N/A
            cells[3].text = "*"

        for x in cells[2].text:
            if "*" in x:
                print("Failed.docx")
            elif "*" not in x:
                print("Test.docx")

savebtn = Button(root, text = "Save", command = save).grid()

root.mainloop()

Это мой предыдущий вопрос: Ссылка

Я использовал один из ответов наобъедините его с моим вопросом.

Чего я пытаюсь достичь:

Если с помощью переключателей был выбран no для любого из параметров, затем сохранитедокумент как failed.docx, если каждая опция была выбрана без no's, затем сохраните файл как Test.docx.

Моя проблема:

Почемумой последний цикл for и оператор if не работает.

Когда я выбираю вариант no, он возвращает мне Failed.docx. Но если ни один из no' не выбран, это ничего не делает? вообще не запускает оператор elif.

1 Ответ

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

В своем коде вы пишете в docx построчно, создавая cells на каждой итерации. ячейки - это строка, содержащая три значения радиокнопок для одной опции. Допустим, если вы выберете Yes для option3, ячейки будут содержать [* '' ''] для его итерации.

cells[0] = *
cells[1] = ''
cells[2] = ''

Также, когда вы пытаетесь перебрать cells[1].text, вы пытаетесь перебрать пустой элемент. Вот почему он никогда не попадает в операторы if-elif, потому что он никогда не включается в цикл for.
(не уверен, что мне удалось объяснить это четко, но если вы используете значение для невыбранных радиокнопок или отладчика, вы можете видеть достаточно ясночто происходит)

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

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 = "*"
        cells[2].text = "not-selected"
        cells[3].text = "not-selected"
    elif val == 1:   # checks if no
        cells[2].text = "*"
        cells[1].text = "not-selected"
        cells[3].text = "not-selected"
    elif val == 0:   # checks if N/A
        cells[3].text = "*"
        cells[1].text = "not-selected"
        cells[2].text = "not-selected"

fn = 'Test.docx'
for cell in table.columns[2].cells[1:4]: #column2 is No column, 1:4 excludes header cell
    if cell.text == '*':
        fn = 'Failed.docx'
        break

print(fn)
...