Tkinter: Funktion zum Refresh eines Widget's gesucht

Fragen zu Tkinter.
Antworten
MightyJ

Hallo zusammen!

Wie schon der Titel sagt, suche ich eine Funktion, mittels derer ich alle in einem Widget dargestellten Variablen neu laden kann, um somit auf eventuelle Änderungen in den Variablen reagieren zu können.

In Java gibt es hierfür beispielsweise die Funktion repaint(). Trotz intensiver Suche habe ich sowas leider für Python noch nicht gefunden :-(

Das einzige, was mir einfallen würde, wäre, die entsprechenden Variablen dadurch neu zu laden, indem ich einfach die Label, Entry oder OptionMenu neu mache. Aber irgendwie kann das auch nicht ganz Sinn und Zweck der Sache sein...

Darum meine Frage: Kennt jemand eine Standardfunktion, die genau diese Aufgabe übernimmt?

Danke schon mal im Voraus :-)

MfG
MightyJ
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Hi MightyJ,

update_idletasks() siehe Event processing


Gruß

Dookie
MightyJ

Hallo Dookie!

Erstmal vielen Dank für deine schnelle Antwort.

Leider funktioniert das aber bei mir nicht :-( Wenn ich die Funktion richtig verstanden habe, dann kann ich damit zum Beispiel sowas machen:

Code: Alles auswählen

self.labelname["text"] = "Neuer Text"
self.labelname.update_idletasks()
Damit sollte dem Label jetzt der Text "Neuer Text" zugewiesen sein.

In meinem Programm hingegen setze ich Label nicht direkt auf einen Wert, sondern beziehe die Werte aus einer Datei. Das heißt, dass er die Werte aus der Datei neu laden müsste, um alles korrekt anzuzeigen.

Für ein OptionMenu sieht das bei mir so aus:

Code: Alles auswählen

self.ktonr = StringVar()
konten = ermittlungen.kontenErmitteln()
self.om = OptionMenu(self, self.ktonr, *konten)
self.om.grid(row = 4, column = 1, sticky = W)
Jetzt kann es aber passieren, dass ich während der Verarbeitung ein neues Konto anlege, was dann natürlich auch in diesem OptionMenu angezeigt werden soll. Hierzu dachte ich mir, dass ich nach dem Anlegen eines neuen Kontos einfach mal folgendes mache:

Code: Alles auswählen

self.om.update_idletasks()
Leider funktioniert das aber nicht... Es funktioniert auch nicht, wenn ich statt "update_idletasks" "update" nehme.

Ich müsste ihm also prinzipiell irgendwie sagen können, dass er die gesamte Verarbeitung dieses OptionMenu noch mal machen soll, speziell das Laden der Daten aus der Datei. Das könnte ich natürlich, wie schon gesagt, machen, indem ich einfach das ganze OptionMenu noch mal aufbaue. Aber das will ich ja nicht.

Vielleicht gibt es ja noch eine ganz einfache Lösung, auf die ich gerade nicht komme... Wäre auf jeden Fall schön, wenn da jemand einen Tipp für mich hätte :-)

Vielleicht stell ich mich heute auch einfach nur zu blöd an, ist ja noch Montag ;-)

MfG
MightyJ
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hallo Mighty!

So wie ich dich verstehe möchtest du
die Eigenschaften eines TK-Widgets
ändern ohne es neu erzeugen zu müssen.

Hier eine von 100 Möglichkeiten die
Eigenschaften eines TK-Label-Widget
mittels der Methode:

configure

zu ändern.

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: UTF-8 -*-

from Tkinter import *


def Repaint():
	#~~ Rekonfiguriert das Labelfeld
	global toggleflag

	if not toggleflag:
		toggleflag = TRUE
		propset = 1
	else:
		toggleflag = FALSE
		propset = 0

	bd,bg,fg,relief,font,text = properties[propset]
	lab.configure(bd     = bd,
				  relief = relief,
				  font   = font,
				  bg     = bg,
				  fg     = fg,
				  text   = text,
				  )

#~~ Erzeugt Hauptfenster
root = Tk()
root.configure(bd=2,relief='raised',bg='steelblue')
root.title('Test')

toggleflag = FALSE

#~~ Eigenschaften-Liste mit zwei Datensets (evt. von Datei geladen)
properties = [[2,'gold','black' ,'sunken',('Arial',10,'bold')  ,'First' ],
			  [1,'red' ,'yellow','raised',('Arial',10,'normal'),'Second'],
			 ]
#~~ Erzeugt Labelfeld
lab = Label(root)
lab.pack(fill = BOTH,padx=10,pady=5)

# Schaltfläche für Repaint
bende = Button(root, text = "Repaint", command = Repaint)
bende.pack(side= 'bottom',pady=5)

Repaint()

root.mainloop()
Gruss wuf :wink:
Take it easy Mates!
MightyJ

Hallo wuf!

Erstmal danke für deine Antwort.

Leider ist das auch nicht das, wonach ich gesucht habe. Das man die Eigenschaften eines Labels beispielsweise mit configure ändern kann, wusste ich schon. Nur hatte ich eben gehofft, dass es in Python eine Standardfunktion gibt, mittels derer ich das realisieren kann, ohne noch mal zusätzlichen Code zu schreiben.

Dies scheitert aber in meinem Fall wohl daran, dass ich die Werte aus einer Datei beziehe und sich somit an den Variablen zunächst mal nichts verändert, wenn ich neue Werte in die Datei schreibe. Deshalb muss ich dann doch nach einer Veränderung einmal manuell die Werte aus der Funktion auslesen und dann beispielsweise mittels configure die neuen Werte zuweisen. Und da dachte ich eben, dass es vielleicht eine Standardfunktion gibt, die diese beiden Schritte zu einem zusammenfasst.

Nun gut, ich werds dann in 2 Schritte aufteilen, funktionieren tuts dann ja... Auch wenn ich es immer noch etwas unschön finde ;-)

MfG
MightyJ
Antworten