2017-02-25 4 views
-1

Ich muss ein Label basierend auf Text in einer sich ändernden JSON-Datei automatisch aktualisieren. Ich habe in mehreren StackOverflow-Posts gelesen, dass StringVar() eine gute integrierte tk-Lösung zum Verknüpfen von Etikettentext mit einer Variablen ist.update tkinter label text in der Seitenklasse python

Meine Frage unterscheidet sich von anderen Posts darin, dass ich versuche, das Etikett nur aus der Page Klasse, die unten aufgeführt ist, zu aktualisieren (in nur dem Code für diese Seite). Mit anderen Worten, Page wird irgendwo in einer größeren App aufgerufen - und Page muss die Bezeichnung mit dem entsprechenden Wert aus der JSON-Datei laden.

Die meisten anderen Posts nähern sich Label-Aktualisierung von einer separaten Methode (d. H. Ein Klick-Ereignis auf der Seite). Ich habe jedoch mehrere Seiten, die Daten aus einer JSON-Datei laden, die ständig aktualisiert wird.

  1. (aufgelöst) Wenn ich den Code ausführen bekomme ich Label Text sagen "PY_VAR1". Wie behebe ich das?

  2. Wenn Page zum ersten Mal aufgerufen wird, ist der Beschriftungstext korrekt (Initialisierung funktionierte ordnungsgemäß). Wenn jedoch auf andere Anwendungsseiten zugegriffen wird und dann Page zurückgegeben wird, bleibt der Beschriftungstext auf dem initialisierten Wert und nicht auf dem aktualisierten JSON-Wert. Wie kann der Label-Wert nach der Initialisierung nur mit Page Code aktualisiert werden?

Hinweis - Python Tkinter, modify Text from outside the class ähnelt dem Problem, aber ich möchte den Text aus innerhalb die Klasse ändern.

PY_VAR1 Update:

PY_VAR1 Ausgabe mit text = "Test Type: {}".format(data['test_type']) fixiert. Allerdings benötigen Sie immer noch eine Lösung für erfolgreiche automatische Updates des Labels mit JSON-Content-Änderungen.

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

Ihre 'test_type' ist eine Instanz von' tk.StringVar'. Mit '' str() ''geben Sie einfach den zugewiesenen Namen für die' tk.StringVar' zurück. – abccd

+0

@abccd Ich benutze str() wegen, wenn ich ein 'TypeError' gefunden habe: 'StringVar' Objekt kann nicht in str implizit konvertiert werden ' –

+1

car't du nur 'label = ttk.Label (self, text =" Test Type : {} ". format (daten ['test_type']))'? – abccd

Antwort

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

'nach' ist genau die Funktion, die ich brauche. Vielen Dank! Das nervt mich schon lange ... –