更新页面类python

时间:2017-02-25 23:59:30

标签: python tkinter label

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

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

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

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

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

  3. 注意 - Python Tkinter, modify Text from outside the class与此问题类似,但我想修改内部类的文本。

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

1 个答案:

答案 0 :(得分:2)

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