【问题标题】:get text from tkinter text box in a different function在不同的函数中从 tkinter 文本框中获取文本
【发布时间】:2020-01-25 19:20:45
【问题描述】:

美好的一天。 我有一个带有 4 个复选按钮的简单 tkinter UI。每个都有一个关联的文本框。我设法通过从 .txt 文件中的字典获取复选框状态和文本框中的文本来创建 UI。我还可以使用 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"]
}

【问题讨论】:

  • 对 Checkbuttons 执行相同的操作 - 使用所有 commentBox 创建列表/字典并发送到 update 作为参数 - update(..., all_textboxes) - 在 update() 内部使用 ie。 all_textboxes[0].get()

标签: python function tkinter get textbox


【解决方案1】:

您可以创建包含所有chkVarcommentBox 的列表/字典

 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))

【讨论】:

  • 谢谢@furas,我已经添加了更改,这几乎可以工作。我收到一个错误,即键必须是字符串:,当我将键转换为字符串时: all_items[str(key)] = [chkVar, commentBox] 然后我将新项目附加到字典而不是覆盖旧值.想法?
  • 这里是错误消息的一部分:Tkinter 回调中的异常 return _iterencode(o, 0) TypeError: keys must be a string
  • 我想我找到了问题(不是解决方案)。这种格式的 dict 文件:{'crit1': [1, 'cmets'], 'crit3': [1, 'cmets3'], 'crit4': [1, 'comment4'], 'crit2': [1 , 'comment2']} 但是当我 json.dumps 文件时,它看起来像这样: {: [1, 'cmets'], 'crit2': [1, 'comment2'], 'crit3': [1, 'cmets3'], : [1, 'comment4'], 'crit1': [1, 'cmets'], : [1, 'cmets3'], 'crit4': [1, 'comment4'], : [1, 'comment2']}
  • 所以问题似乎是 update() 函数中的 critDict[key] 是 tkinter 对象 ID,而不是我们加载 critDict 时的键,应该是 'crit1' 、“crit2”、“crit3”或“crit4”。
  • 已解决:我在创建检查按钮时覆盖了我的 critDict 键。
猜你喜欢
  • 2018-08-04
  • 1970-01-01
  • 1970-01-01
  • 2015-11-22
  • 2012-08-09
  • 1970-01-01
  • 2021-08-31
  • 1970-01-01
相关资源
最近更新 更多