Label verliert image nach in root.after() Loop mit config
Verfasst: Freitag 10. Januar 2020, 11:16
Hallo,
Ich bin gerade dabei eine art Anzeigetafel zu programieren, welche unter anderem auch die Temperetur anzeigen soll. Für die Zahlen verwende ich Labels mit Bildern(1-9 für einer und 1-4 für zehner), da ich den Hintergrund behalten möchte und Labels immer eine Hintergrundfarbe haben. Nun habe ich einen Loop mit root.after(1000, my_loop) erstellt, damit die Labels dauernd geupdated werden, falls sich eine Zahl ändert. Dafür habe ich in den Loop .config() verwendet, damit das Labal immer das aktuelle image erhält, allerdings wenn mein Programm in den Loop geht, zeigen die Label nichts mehr an, sondern nur ihre standart Hintergrundfarbe.
Ich bin noch recht neu mir GUI´s, Ich weiß, dass mein code auch nicht der beste weg ist, eine Anzeigetafel zu programieren, weshalb ich mir wünsche, nur Hilfen für mein Problem und nicht für eventuell ineffiziente Programierung des restlichen Codes (Es sei denn ihr könnt es nicht mit ansehen
).
P.S. Die prints waren für mich als hilfe, um zu sehen, welche Variablen in den Loop übernommen wurden (alle)
Ich bin gerade dabei eine art Anzeigetafel zu programieren, welche unter anderem auch die Temperetur anzeigen soll. Für die Zahlen verwende ich Labels mit Bildern(1-9 für einer und 1-4 für zehner), da ich den Hintergrund behalten möchte und Labels immer eine Hintergrundfarbe haben. Nun habe ich einen Loop mit root.after(1000, my_loop) erstellt, damit die Labels dauernd geupdated werden, falls sich eine Zahl ändert. Dafür habe ich in den Loop .config() verwendet, damit das Labal immer das aktuelle image erhält, allerdings wenn mein Programm in den Loop geht, zeigen die Label nichts mehr an, sondern nur ihre standart Hintergrundfarbe.
Ich bin noch recht neu mir GUI´s, Ich weiß, dass mein code auch nicht der beste weg ist, eine Anzeigetafel zu programieren, weshalb ich mir wünsche, nur Hilfen für mein Problem und nicht für eventuell ineffiziente Programierung des restlichen Codes (Es sei denn ihr könnt es nicht mit ansehen

Code: Alles auswählen
from tkinter import *
from tkinter import ttk
from PIL import ImageTk, Image
class GUI():
def __init__(self):
global new_widtha, new_heighta, new_widthb, new_heightb, temperatureeiner, temperaturezehner
root = Tk()
root.title("Title")
root.geometry('600x600')
root.attributes('-fullscreen', True)
root.bind('<Escape>',lambda e: root.destroy())
a = "0"
b = "0"
def temp():
a = "1"
b = "6"
print(a+b)
button = Button(root, command = temp)
button.pack()
#Der Part ist für den Hintergrund, hab ich nicht selbst gemacht
def motion(event):
global x, y
x, y = event.x, event.y
def resize_image(event):
new_width = event.width
new_height = event.height
background = copy_of_background.resize((new_width, new_height))
print(new_height, new_width)
photo = ImageTk.PhotoImage(background)
label.config(image = photo)
label.image = photo
def resize_numbers(width, height):
new_widthc = int(width * 0.96)
new_heightc = int(height * 0.72)
return new_widthc, new_heightc
background = Image.open('/Solarmonitor/Textures/solarmonitor.png')
copy_of_background = background.copy()
photo = ImageTk.PhotoImage(background)
label = ttk.Label(root, image = photo)
label.bind('<Configure>', resize_image)
label.bind("<Motion>", motion)
label.pack(fill=BOTH, expand = YES)
#------------------------------------------------------------
temperatur_zehner = Image.open("/Solarmonitor/Textures/zehner"+a+".png")
temperatur_einer = Image.open("/Solarmonitor/Textures/einer"+b+".png")
with Image.open("/Solarmonitor/Textures/zehner" + a + ".png") as img:
widtha, heighta = img.size
print (widtha, heighta)
with Image.open("/Solarmonitor/Textures/einer" + b + ".png") as img:
widthb, heightb = img.size
print(widthb, heightb)
new_widtha, new_heighta = resize_numbers(widtha, heighta)
temperatur_zehner = temperatur_zehner.resize((new_widtha, new_heighta))
temperatur_zehner = ImageTk.PhotoImage(temperatur_zehner)
temperaturezehner = Label(root, image = temperatur_zehner, borderwidth = 0)
temperaturezehner.place(x = 154, y = 590)
new_widthb, new_heightb = resize_numbers(widthb, heightb)
temperatur_einer = temperatur_einer.resize((new_widthb, new_heightb))
temperatur_einer = ImageTk.PhotoImage(temperatur_einer)
temperatureeiner = Label(root, image = temperatur_einer, borderwidth = 0)
temperatureeiner.place(x = 250, y = 590)
print("hello", temperatureeiner, temperaturezehner)
#Der betreffende Loop
def my_loop():
global temperatureeiner, temperaturezehner
print (temperatureeiner, temperaturezehner, a, b)
temperatur_zehner = Image.open("/Solarmonitor/Textures/zehner" + a + ".png")
temperatur_einer = Image.open("/Solarmonitor/Textures/einer" + b + ".png")
temperatur_zehner = temperatur_zehner.resize((new_widtha, new_heighta))
temperatur_zehner = ImageTk.PhotoImage(temperatur_zehner)
temperaturezehner.config(image=temperatur_zehner)
temperatur_einer = temperatur_einer.resize((new_widthb, new_heightb))
temperatur_einer = ImageTk.PhotoImage(temperatur_einer)
temperatureeiner.config(image=temperatur_einer)
print("hi", new_widtha, new_heighta, new_widthb, new_heightb)
print(temperatureeiner, temperaturezehner)
root.after(1000, my_loop)
root.after(1000, my_loop)
root.mainloop()