【问题标题】:update tkinter label text in page class python更新页面类python中的tkinter标签文本
【发布时间】:2017-02-25 23:59:29
【问题描述】:

我需要根据不断变化的 JSON 文件中的文本自动更新标签。我在几篇 StackOverflow 帖子中读到 StringVar() 是一个很好的内置 tk 解决方案,用于将标签文本链接到变量。

我的问题与其他帖子不同,因为我试图仅从下面列出的 Page 类更新标签(仅在此页面的代码中)。换句话说,Page 在较大的应用程序中被调用 - 而Page 需要从 JSON 文件中加载具有适当值的标签。

大多数其他帖子都通过单独的方法(即页面上的点击事件)进行标签更新。但是,我有几个页面从不断更新的 json 文件中加载数据。

  1. 已解决)当我运行代码时,我得到标签文本说“PY_VAR1”。我该如何解决这个问题?

  2. 第一次访问Page 时,标签文本是正确的(初始化工作正常)。但是,当访问其他应用页面然后返回Page时,标签文本保持在初始化值,而不是更新后的json值。 only 使用Page 代码初始化后如何更新标签值?

注意 - Python Tkinter, modify Text from outside the class 与问题类似,但我想修改 inside 类中的文本。

PY_VAR1 更新:

PY_VAR1 问题已通过 text = "Test Type: {}".format(data['test_type']) 修复。但是,仍然需要通过 json 内容更改成功地自动更新标签的解决方案。

import tkinter as tk
from tkinter import messagebox
from tkinter import ttk

# File system access library
import glob, os

import json

class Page(tk.Frame):
        test_type = tk.StringVar()

        def __init__(self, parent, controller):
                tk.Frame.__init__(self, parent)

                # app controller
                self.controller = controller

                test_type = tk.StringVar()

                # Read json file
                with open('data.json','r') as f:
                        data = json.load(f)

                test_type.set(data['test_type'])

                label = ttk.Label(self, text=str("Test Type: " + str(test_type)))
                label.pack(pady=1,padx=1, side = "top", anchor = "n")

                button = ttk.Button(self, text="Previous Page",
                                    command=lambda: controller.show_page("Save_Test_Page"))
                button.pack(pady=1,padx=15, side = "left", expand = "no", anchor = "n")

【问题讨论】:

  • 您的test_typetk.StringVar 的一个实例。通过str()ing 它,您只是返回了tk.StringVar 的指定名称。
  • @abccd 我在遇到TypeError: Can't convert 'StringVar' object to str implicitly 错误时使用了 str()
  • 你不只是做label = ttk.Label(self, text="Test Type: {}".format(data['test_type']))吗?
  • @abccd 好的,json 文件中的文本现在可以正确显示。问题还询问如何每次从Page 更新标签。对此有任何意见吗?标签尚未自动更新。
  • 你做过研究吗?实际上有数百个与更新标签相关的问题和答案,大多数 tkinter 文档也涵盖了这一点。

标签: python tkinter label


【解决方案1】:
import tkinter as tk
from tkinter import messagebox
from tkinter import ttk

# File system access library
import glob, os

import json

class Page(tk.Frame):
        test_type = tk.StringVar()

        def update_lable(self, label):
                # Read json file
                with open('data.json','r') as f:
                        data = json.load(f)
                label['text'] = "Test Type: {}".format(data['test_type'])
                #rerun this every 1000 ms or 1 second
                root.after(1000, self.update_lable(label)) #or whatever your root was called


        def __init__(self, parent, controller):
                tk.Frame.__init__(self, parent)

                # app controller
                self.controller = controller


                # Read json file
                with open('data.json','r') as f:
                        data = json.load(f)


                label = ttk.Label(self, text="Test Type: {}".format(data['test_type']))
                label.pack(pady=1,padx=1, side = "top", anchor = "n")
                self.update_label(label)
                button = ttk.Button(self, text="Previous Page",
                                    command=lambda: controller.show_page("Save_Test_Page"))
                button.pack(pady=1,padx=15, side = "left", expand = "no", anchor = "n")

【讨论】:

  • after 正是我需要的功能。谢谢!这个问题困扰了我很久...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多