получить текст из текстового поля tkinter в другой функции - PullRequest
0 голосов
/ 25 января 2020

Добрый день. У меня есть простой интерфейс Tkinter с 4 кнопками. У каждого есть связанное текстовое поле. Мне удалось создать пользовательский интерфейс, получив состояние флажка и текст в текстовом поле из словаря в текстовом файле .txt. Я также могу успешно записать измененное состояние кнопки возврата в файл с помощью функции update ().

ПРОБЛЕМА. У меня проблемы с выяснением, как получить и записать измененный текст в текстовом поле обратно в файл. Мне нужно получить строку текстового поля для каждого текстового поля, но они являются локальными для функции makeUI (). Я не уверен, как передать все текстовые поля в функцию update ().

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

Ниже приведен код:

from tkinter import *
from tkinter.scrolledtext import ScrolledText
import json

def loadDictFile(data_folder): 
    critDict = json.loads(open(data_folder+'critDict3.txt').read())
    return critDict

def update(critDict, checkbuttons, data_folder):
    for k in checkbuttons:
        key = k.cget('text')
        critDict[key][0] = k.var.get() 
        critDict[key][1] = commentBox.get("1.0",'end-1c') # <--HERE IS THE PROBLEM
    with open(data_folder+'critDict3.txt', 'w') as file:
        file.write(json.dumps(critDict))

def makeUI(data_folder, critDict):
    newDict = critDict
    top = Tk()
    checkbuttons={}
    for key, val in newDict.items():
        chkVar = IntVar()
        key  = Checkbutton(top, text = key, variable=chkVar) 
        key.var = chkVar
        key.var.set(val[0])
        key.pack()

        commentBox = ScrolledText(top, height=2, width=30)
        commentBox.pack()
        commentBox.insert(END, val[1])
        comment = commentBox.get("1.0",'end-1c')
        checkbuttons[key]=comment

    print('checkbuttons is', checkbuttons)

    button=Button(top, text="Update", command=lambda : update(critDict, checkbuttons, data_folder))
    button.pack()

    top.mainloop()


data_folder = "C:\\Users\\NB\\test\\data\\"
critDict = loadDictFile(data_folder)
makeUI(data_folder, critDict)

и вот текст файла диска 'critDict3.txt

{
"crit1": [1, "comments"], "crit4": [1, "comment4"], "crit2": [1, "comment2"], "crit3": [1, "comments3"]
}

1 Ответ

0 голосов
/ 26 января 2020

Вы можете создать список / словарь со всеми chkVar и commentBox

 all_items[key] = [chkVar, commentBox]

и отправить в update()

 command=lambda:update(critDict, all_items, data_folder))

, а внутри update() вы можете получить доступ это

 for key, [chkVar, commentBox]  in all_items.items():

def makeUI(data_folder, critDict):
    top = Tk()

    all_items = {}

    for key, val in critDict.items():
        chkVar = IntVar(value=val[0])
        cb = Checkbutton(top, text=key, variable=chkVar) 
        cb.pack()

        commentBox = ScrolledText(top, height=2, width=30)
        commentBox.pack()
        commentBox.insert('end', val[1])

        all_items[key] = [chkVar, commentBox]

    button = Button(top, text="Update", command=lambda:update(critDict, all_items, data_folder))
    button.pack()

    top.mainloop()

def update(critDict, all_items, data_folder):

    for key, [chkVar, commentBox]  in all_items.items():
        critDict[key] = [chkVar.get(), commentBox.get("1.0", 'end-1c')]

    with open(data_folder+'critDict3.txt', 'w') as file:
        file.write(json.dumps(critDict))
...