Toplevel Fenster schliessen

Fragen zu Tkinter.
Lacsap93
User
Beiträge: 23
Registriert: Mittwoch 20. November 2019, 08:50

Hallo zusammen
Ich habe diese Frage schon in einem anderen Forum gestellt, leider konnte man mir da nicht weiterhelfen. Mir wurde empfohlen doch einmal hier nachzufragen:
Ich habe ein root Fenster mit vielen Werten. In diesem wird mit einem Button ein Toplevelfenster geöffnet. In diesem Toplevelfenster habe ich wieder einige Werte und einen Button, mit dem ich nur das Toplevel Fenster wieder schliessen möchte.
Das Problem ist nun, wenn ich den Button zum schliessen des Toplevelfensters drücke, nur der Inhalt des Toplevelfensters gelöscht wird, aber das Fenster nicht geschlossen wird.

Folgender Code ist lauffähig und ziemlich zusammengeschrumpft. Das HorizontalScrolledFrame habe ich drinn gelassen, damit man sieht woher wetter1b "abstammt".

Code: Alles auswählen

import tkinter as tk
import json
import requests
import time
import datetime
Response = requests.get ("http://api.openweathermap.org/data/2.5/forecast?q=XXXXX,XXXX&APPID=XXXXXXXXXXXXXXX")
WeatherData=Response.json()
print(json.dumps(WeatherData, indent = 4, sort_keys = True))
class HorizontalScrolledFrame:
    def __init__(self, master, **kwargs):
        width = kwargs.pop('width', None)
        height = kwargs.pop('height', None)
        bg = kwargs.pop('bg', kwargs.pop('background', None))
        self.outer = tk.Frame(master, **kwargs)
        self.vsb = tk.Scrollbar(self.outer, orient="horizontal")
        self.vsb.pack(fill="x", side="bottom")
        self.canvas = tk.Canvas(self.outer, highlightthickness="0", width="600", height="375", bg="white")
        self.canvas.pack(side="top", fill="both", expand=True)
        self.canvas['xscrollcommand'] = self.vsb.set
        self.vsb['command'] = self.canvas.xview
        self.inner = tk.Frame(self.canvas, bg="turquoise")
        self.canvas.create_window(0, 0, window=self.inner, anchor='nw')
        self.inner.bind("<Configure>", self._on_frame_configure)
        self.outer_attr = set(dir(tk.Widget))
    def __getattr__(self, item):
        if item in self.outer_attr:
            return getattr(self.outer, item)
        else:
            return getattr(self.inner, item)
    def _on_frame_configure(self, event=None):
        x1, y1, x2, y2 = self.canvas.bbox("all")
        height = self.canvas.winfo_height()
        self.canvas.config(scrollregion = (0,0, x2, max(y2, height)))
class wetter1b (HorizontalScrolledFrame):
    
    def __init__(self,master=None):
        super().__init__(master)
        self.master=master
        self.grid (row=0, column=0, padx=10, pady=10)
        self.bild(0,None)
    def bild(self,number,color):
        if number==0:
            zahl=self.neu_Tag0
  
        if color is not None:
            self.tag = tk.Button(self,bg=color, command=zahl)
        else:
            self.tag = tk.Button(self, command=zahl)
        WetterBild = tk.PhotoImage(file = '/Users/pboehlen/Desktop/Programme/So.png')
        self.tag.config(image=WetterBild, bg="black")
        self.tag.image = (WetterBild)
        self.tag.grid (row=1, column=number, padx=10, pady=10)
        
    def neu_Tag0(self):
        window = tk.Toplevel(self)
        label = wetterTag0(window)
        label.grid(row=1, column=0, padx=10, pady=10)
        
        
class wetterTag0 (HorizontalScrolledFrame):
    def __init__(self,master=None):
        super().__init__(master)
        self.master=master
        self.grid (row=0, column=0, padx=10, pady=10)
        self.bild0(0,None)
        self.bild0(1,"light blue")
    def quit(self):
        self.destroy()
        
    def bild0(self,number,color):
            
        if color is not None:
            self.tag = tk.Label(self,bg=color)
        else:
            self.tag = tk.Label(self)           
 
        WetterBild = tk.PhotoImage(file = '/Users/pboehlen/Desktop/Programme/So.png')
        self.tag.config(image=WetterBild, bg="black")
        self.tag.image = (WetterBild)
        self.tag.grid (row=1, column=number, padx=10, pady=10)
        
        self.schliessen=tk.Button(self, command=self.quit)
        self.schliessen.grid (row=2, column=10, padx=10, pady=1)
           
root=tk.Tk()
root.protocol("WM_DELETE_WINDOW", quit)       
        
if __name__ == "__main__":
    root.title("Wetter Heute " + (time.strftime("%d.%m.%Y %H:%M:%S")))
    root.geometry('800x450')
    root.config(background="#BAFBAF")    
app=wetter1b (master=root)
app.mainloop()
Kann mir jemand mit meinem Problem weiterhelfen?
Ich hatte auch schon im Internet gesucht, aber leider die passende Lösung noch nicht gefunden.

Liebe Grüsse
Lacasp
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Das ist alles ziemlich verworren. Alles auf oberster Ebene (außer Definitionen) gehört in eine Funktion, die üblicherweise main genannt wird, und in diesem `if __name__`-Block aufgerufen wird. So wie der da jetzt unmotiviert mitten drin steht, macht das keinen Sinn.
Nach Konvention werden nur Klassen mit großem Anfangsbuchstaben geschrieben, alle Variablennamen und Methodennamen werden klein_mit_unterstrich geschrieben. Dass das stellenweise genau umgekehrt ist, macht das Lesen des Code sehr schwierig. Was soll die 0 bei neu_Tag0, wetterTag0 oder bild0? Namen sollten aussagekräftig sein.
Es macht auch keinen Sinn `bild0` zwei mal aufzurufen, weil darin der Schließen-Button auch zwei mal erstellt wird. Am besten erzeugt mal alle Widgets direkt in __init__, dann findet man sie einfach wieder.
Wo erstellst Du das TopLevel-Fenster und welches Objekt wird beim Schließen zerstört?
Lacsap93
User
Beiträge: 23
Registriert: Mittwoch 20. November 2019, 08:50

Hallo Sirius
Danke für die Antwort. Ich habe den Code nun angepasst und hoffe ich habe es so gemacht, wie du gemeint hast:

Code: Alles auswählen

import tkinter as tk
import json
import requests
import time
import datetime

Response = requests.get ("http://api.openweathermap.org/data/2.5/forecast?q=Alchenflüh,CH&APPID=d09ab103ebca7fb9d170815f55aedf98")
WeatherData=Response.json()
print(json.dumps(WeatherData, indent = 4, sort_keys = True))


class HorizontalScrolledFrame:


    def __init__(self, master, **kwargs):
        width = kwargs.pop('width', None)
        height = kwargs.pop('height', None)
        bg = kwargs.pop('bg', kwargs.pop('background', None))
        self.outer = tk.Frame(master, **kwargs)

        self.vsb = tk.Scrollbar(self.outer, orient="horizontal")
        self.vsb.pack(fill="x", side="bottom")
        self.canvas = tk.Canvas(self.outer, highlightthickness="0", width="600", height="375", bg="white")
        self.canvas.pack(side="top", fill="both", expand=True)
        self.canvas['xscrollcommand'] = self.vsb.set
        self.vsb['command'] = self.canvas.xview

        self.inner = tk.Frame(self.canvas, bg="turquoise")
        self.canvas.create_window(0, 0, window=self.inner, anchor='nw')
        self.inner.bind("<Configure>", self._on_frame_configure)

        self.outer_attr = set(dir(tk.Widget))

    def __getattr__(self, item):
        if item in self.outer_attr:
            return getattr(self.outer, item)
        else:
            return getattr(self.inner, item)

    def _on_frame_configure(self, event=None):
        x1, y1, x2, y2 = self.canvas.bbox("all")
        height = self.canvas.winfo_height()
        self.canvas.config(scrollregion = (0,0, x2, max(y2, height)))


class Wetter1b (HorizontalScrolledFrame):
    
    def __init__(self,master=None):
        super().__init__(master)
        self.master=master
        self.grid (row=0, column=0, padx=10, pady=10)
        self.bild(0,None)
        
    def bild(self,number,color):

        if number==0:
            zahl=self.neu_tag0
  
        if color is not None:
            self.tag = tk.Button(self,bg=color, command=zahl)
        else:
            self.tag = tk.Button(self, command=zahl)

        wetter_bild = tk.PhotoImage(file = '/Users/pboehlen/Desktop/Programme/So.png')

        self.tag.config(image=wetter_bild, bg="black")
        self.tag.image = (wetter_bild)
        self.tag.grid (row=1, column=number, padx=10, pady=10)
        
    def neu_tag0(self):
        window = tk.Toplevel(self)
        label = WetterTag0(window)
        label.grid(row=1, column=0, padx=10, pady=10)
        
        
class WetterTag0 (Wetter1b):
    def __init__(self,master=None):
        super().__init__(master)
        self.master=master
        self.grid (row=0, column=0, padx=10, pady=10)
        self.schliessen=tk.Button(self, command=self.quit)
        self.schliessen.grid (row=2, column=10, padx=10, pady=1)
        self.bild0(0,None)
        self.bild0(1,"light blue")

    def quit(self):
        self.destroy()
        
    def bild0(self,number,color):
            
        if color is not None:
            self.tag = tk.Label(self,bg=color)
        else:
            self.tag = tk.Label(self)           

 
        wetter_bild = tk.PhotoImage(file = '/Users/pboehlen/Desktop/Programme/So.png')

        self.tag.config(image=wetter_bild, bg="black")
        self.tag.image = (wetter_bild)
        self.tag.grid (row=1, column=number, padx=10, pady=10)
        
        
if __name__ == "__main__":
    root=tk.Tk()
    root.title("Wetter Heute " + (time.strftime("%d.%m.%Y %H:%M:%S")))
    root.geometry('800x450')
    root.config(background="#BAFBAF")
    root.protocol("WM_DELETE_WINDOW", quit)    
    
app=Wetter1b (master=root)

app.mainloop()
Dies ist nur ein Teil des Codes. Es würde WetterTag0-WetterTag4 geben. Wobei 0 für heute steht und 4 für über- übermorgen (also in 3 Tagen). Ich weiss dass die Wahl der Namen nicht ganz optimal ist, aber ich dachte, dass dies einfacher wäre als die Variable WetterUeberUebermorgen zu nennen. Und so haben alle Variablen in der Klasse WetterTag0 auch eine Null hinten dran so wie bild0 und neu_Tag0, damit man sieht, wohin sie genau gehört.
Das Toplevel-Fenster wird in der Klasse Wetter1b erstellt und ich dachte eigentlich, dass WetterTag0 zerstört wird. Aber wenn du mich nun so fragst bin ich mir unsicher.
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Was unterscheidet denn einen morgen von übermorgen? Das sollten keine eigenen Klassen mit lustig durchnummerierten Methoden und Funktionen sein, sondern eine Klasse, die man für beliebige Tage benutzen kann. Welcher Tag konkret, wird über die Argumente festgelegt.

In Wetter1b.bild ist `zahl` nur definiert, wenn number == 0 ist, das führt also sonst zu einem Fehler.
Die Unterscheidung nach ob `color is None` oder nicht sollte so wenig Code wie möglich enthalten, also nicht die gesamte Label-Generierung in beiden Zweigen vorkommen.
Lacsap93
User
Beiträge: 23
Registriert: Mittwoch 20. November 2019, 08:50

@Sirius3 Wenn ich das alles geändert habe, sollte der Schliessbefehl dann funktionieren? Ich habe im Moment zu wenig Zeit das Programm anzupassen aber vielleicht schaffe ich es am Wochenende.
__deets__
User
Beiträge: 14529
Registriert: Mittwoch 14. Oktober 2015, 14:29

Der Schliessbefehl funktioniert, wenn er auf dem richtigen Objekt aufgerufen wird. Das es das nicht wird hat erstmal mit der Struktur nichts zu tun, aber mit guter Struktur kommt hoffentlich Verstaendnis fuer das Problem.
Lacsap93
User
Beiträge: 23
Registriert: Mittwoch 20. November 2019, 08:50

Hallo zusammen
Wie kann ich denn machen, dass eine einzige Klasse für den Toplevel-Aufruf reicht, da ja nicht immer derselbe Inhalt im Toplevel-Fenster ist? Ich habe es mit if-Anweisungen versucht, aber das klappt leider nicht (jedenfalls nicht so wie ich das versucht habe).
Ich hatte verschiedene Lösungsansätze, aber leider funktionierte keiner. Der unten stehende Code ist einer davon. Dieser gibt im Toplevelfenster vier Bilder aus, wobei die zwei ersten Buttons und die hinteren zwei Labels sind. Es sieht so aus, als würde mir hier noch die Hauptklasse dazwischenfunken, denn eigentlich sollten nur die hinteren zwei Labels ausgegeben werden.

Code: Alles auswählen

import tkinter as tk
import json
import requests
import time
import datetime

Response = requests.get ("http://api.openweathermap.org/data/2.5/forecast?q=Alchenflüh,CH&APPID=d09ab103ebca7fb9d170815f55aedf98")
WeatherData=Response.json()
print(json.dumps(WeatherData, indent = 4, sort_keys = True))


class HorizontalScrolledFrame:


    def __init__(self, master, **kwargs):
        width = kwargs.pop('width', None)
        height = kwargs.pop('height', None)
        bg = kwargs.pop('bg', kwargs.pop('background', None))
        self.outer = tk.Frame(master, **kwargs)

        self.vsb = tk.Scrollbar(self.outer, orient="horizontal")
        self.vsb.pack(fill="x", side="bottom")
        self.canvas = tk.Canvas(self.outer, highlightthickness="0", width="600", height="375", bg="white")
        self.canvas.pack(side="top", fill="both", expand=True)
        self.canvas['xscrollcommand'] = self.vsb.set
        self.vsb['command'] = self.canvas.xview

        self.inner = tk.Frame(self.canvas, bg="turquoise")
        self.canvas.create_window(0, 0, window=self.inner, anchor='nw')
        self.inner.bind("<Configure>", self._on_frame_configure)

        self.outer_attr = set(dir(tk.Widget))

    def __getattr__(self, item):
        if item in self.outer_attr:
            return getattr(self.outer, item)
        else:
            return getattr(self.inner, item)

    def _on_frame_configure(self, event=None):
        x1, y1, x2, y2 = self.canvas.bbox("all")
        height = self.canvas.winfo_height()
        self.canvas.config(scrollregion = (0,0, x2, max(y2, height)))


class Wetter1b (HorizontalScrolledFrame):
    
    def __init__(self,master=None):
        super().__init__(master)
        self.master=master
        self.grid (row=0, column=0, padx=10, pady=10)
        self.bild(0,None)
        self.bild(1,None)
        
    def bild(self,number,color):

        if number==0:
            zahl=self.neu_tag0
        if number==1:
            zahl=self.neu_tag1
  
        if color is not None:
            self.tag = tk.Button(self,bg=color, command=zahl)
        else:
            self.tag = tk.Button(self, command=zahl)

        wetter_bild = tk.PhotoImage(file = '/Users/pboehlen/Desktop/Programme/So.png')

        self.tag.config(image=wetter_bild, bg="black")
        self.tag.image = (wetter_bild)
        self.tag.grid (row=1, column=number, padx=10, pady=10)
        
    def neu_tag0(self):
        window = tk.Toplevel(self)
        label = WetterTag0(window)
        label.grid(row=1, column=0, padx=10, pady=10)
    def neu_tag1(self):
        window = tk.Toplevel(self)
        label = WetterTag0(window)
        label.grid(row=1, column=0, padx=10, pady=10)
        
        
class WetterTag0 (Wetter1b):

    def __init__(self,master=None):
        super().__init__(master)
        self.master=master
        self.grid (row=0, column=0, padx=10, pady=10)
        self.schliessen=tk.Button(self, command=self.quit)
        self.schliessen.grid (row=2, column=10, padx=10, pady=1)
        if Wetter1b.neu_tag0==True:
            self.bild0(0,"light blue")
            self.bild0(1,"light blue")
        elif Wetter1b.neu_tag1==True:
            self.bild0(2,"red")
            self.bild0(3,"red")
        else:
            self.bild0(4,"green")
            self.bild0(5,"green")

    def quit(self):
        self.destroy()
        
    def bild0(self,number,color):
            
        if color is not None:
            self.tag = tk.Label(self,bg=color)
        else:
            self.tag = tk.Label(self)           

 
        wetter_bild = tk.PhotoImage(file = '/Users/pboehlen/Desktop/Programme/So.png')

        self.tag.config(image=wetter_bild, bg="black")
        self.tag.image = (wetter_bild)
        self.tag.grid (row=1, column=number, padx=10, pady=10)
        
        
if __name__ == "__main__":
    root=tk.Tk()
    root.title("Wetter Heute " + (time.strftime("%d.%m.%Y %H:%M:%S")))
    root.geometry('800x450')
    root.config(background="#BAFBAF")
    root.protocol("WM_DELETE_WINDOW", quit)    
    
app=Wetter1b (master=root)

app.mainloop()
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Dein Programm leidet immer noch an den selben Fehlern, die ich schon am Anfang beschrieben hatte, jetzt kommt noch hinzu, dass in WetterTag0 auf Wetter1b.neu_tag0 zugegriffen wird, was so keinen Sinn ergibt und man auch nicht raten kann, was Du denn damit bezwecken wolltest.

Natürlich funkt die Hauptklasse dazwischen, weil Du WetterTag0 von Wetter1b ableitest.
Lacsap93
User
Beiträge: 23
Registriert: Mittwoch 20. November 2019, 08:50

Sirius3 hat geschrieben: Mittwoch 20. November 2019, 21:28 Hallo Sirius
Ich wollte erreichen, dass wenn ich auf den Button von "Heute" (Tag0) klicke auch die Detailansicht von heute öffnet. Und wenn ich auf den Button von morgen (Tag1) klicke auch die Detailansicht von morgen öffnet.
Sirius3 hat geschrieben: Dienstag 26. November 2019, 13:24 jetzt kommt noch hinzu, dass in WetterTag0 auf Wetter1b.neu_tag0 zugegriffen wird, was so keinen Sinn ergibt und man auch nicht raten kann, was Du denn damit bezwecken wolltest.
Ich weiss, dass das nicht gut ist, denn es geht ja auch gar nicht. deshalb habe ich oben gefragt ob mir jemand erklären kann, wie das funktioniert.
Sirius3 hat geschrieben: Dienstag 26. November 2019, 13:24 Dein Programm leidet immer noch an den selben Fehlern, die ich schon am Anfang beschrieben hatte,
Sirius3 hat geschrieben: Mittwoch 20. November 2019, 21:28 Alles auf oberster Ebene (außer Definitionen) gehört in eine Funktion, die üblicherweise main genannt wird, und in diesem `if __name__`-Block aufgerufen wird.
Wie muss ich denn das mit der Funktion auf der obersten Ebene machen? Dieser Teil muss ich in der Doku übersehen haben.
__deets__
User
Beiträge: 14529
Registriert: Mittwoch 14. Oktober 2015, 14:29

Zur letzten Frage sieht das Muster immer gleich aus:

Code: Alles auswählen

def main():
    diese_variable_ist_nicht_global_und_das_ist_gut = MainWindow()
    ...

if __name__ == "__main__": # import guard der verhindert, dass main() aufgerufen wird, wenn das Skript nicht direkt ausgefuehrt, sondern importiert wird
    main()
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@Lacsap93: ja, aber was hat WetterTag0, was mit Deiner Beschreibung jetzt klarer ist, eigentlich WetterDetails heißen sollte, mit Wetter1b, das eigentlich WetterUbersicht heißen sollte, zu tun?
Trenne das sauber, dann hast Du auch kein Problem.
Lacsap93
User
Beiträge: 23
Registriert: Mittwoch 20. November 2019, 08:50

Danke für die Antworten :D
@__deets__
Aber so wie unten ist doch das auch nicht korrekt oder? Denn das bringt ja nichts. Aber wenn ich mein Hauptfenster (app=WetterUebersicht (master=root)) in die main Definition einfüge, habe ich dann natürlich das Problem, dass app von "app.mainloop()" nicht definiert ist. Und app.mainloop() darf ja nicht in die def-Anweisung hinein soviel ich weiss.

Code: Alles auswählen

root=tk.Tk()      
def main():
    root.title("Wetter Heute " + (time.strftime("%d.%m.%Y %H:%M:%S")))
    root.geometry('800x450')
    root.config(background="#BAFBAF")
    root.protocol("WM_DELETE_WINDOW", quit) 

if __name__ == "__main__": # import guard der verhindert, dass main() aufgerufen wird, wenn das Skript nicht direkt ausgefuehrt, sondern importiert wird
    main()  

app=WetterUebersicht (master=root)
app.mainloop()
Was muss denn alles in die Definition?

@Sirius3
Wie kann ich denn in der Detail-Klasse die Unterscheidung machen, von welchem Tag die Detail-Daten geöffnet werden sollen, wenn ich beide Klassen trennen soll? Denn die Unterscheidung was geöffnet werden soll, wird ja in der Übersichts-Klasse gemacht.

==> Mir Ist bewusst, dass dies vielleicht ein bisschen "dumme" Fragen sind. Aber ich komme echt nicht drauf im Moment.
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Warum sollte denn `mainloop` nicht hineindürfen? Wer verbietet das?

Code: Alles auswählen

def main():
    root=tk.Tk()      
    root.title("Wetter Heute " + (time.strftime("%d.%m.%Y %H:%M:%S")))
    root.geometry('800x450')
    root.config(background="#BAFBAF")
    root.protocol("WM_DELETE_WINDOW", quit) 
    app=WetterUebersicht (master=root)
    app.mainloop()

if __name__ == "__main__":
    main()
Klassen haben auch Parameter. Nutzt Du auch fleißig. Der Detail-Klasse mußt Du den Tag übergeben.
Lacsap93
User
Beiträge: 23
Registriert: Mittwoch 20. November 2019, 08:50

Hallo Sirius
Danke für die Antwort.
Ich steh wieder einmal komplett auf dem Schlauch... Verstehe ich dich richtig, dass man die Anweisung, welcher Tag genommen werden soll, über die Parameter der Detail-Klasse gemacht werden soll?
__deets__
User
Beiträge: 14529
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du schreibst

Code: Alles auswählen

class WetterTag0...
Was du stattdessen tun solltest ist (in Ansaetzen):

Code: Alles auswählen

class WetterProTag:

     def __init__(self, tages_abstand):
        self._tages_abstand = tages_abstand
        ... #

morgen = WetterProTag(1)
uebermorgen = WetterProTag(2)
ueberuebermorgen = WetterProTag(3)
in_vier_tagen = WetterProTag(4)
Oder einfach

Code: Alles auswählen

wochen_wetter = [WetterProTag(abstand) for abstand in range(1, 8)]
__deets__
User
Beiträge: 14529
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ein minimales und nicht sehr huebsches Beispiel:

Code: Alles auswählen

import tkinter as tk
import random


class WetterProTag:

    def __init__(self, offset):
        self._offset = offset
        self._frame = None
        self._temperature_var = tk.StringVar()

    def setup_ui(self, parent):
        frame = tk.Frame(parent)
        description = tk.Label(frame, text=f"Tag {self._offset}")
        temperature = tk.Label(frame, textvariable=self._temperature_var)
        description.pack(side=tk.LEFT, anchor=tk.W)
        temperature.pack(side=tk.RIGHT, anchor=tk.E)
        return frame

    def update(self, text):
        self._temperature_var.set(text)


def setup_weather_display(root):
    days = [WetterProTag(i) for i in range(7)]
    for day in days:
        frame = day.setup_ui(root)
        frame.pack(anchor=tk.N)

    def update(temperatures):
        for day, temp in zip(days, temperatures):
            day.update(f"{temp}C")
    return update


def cyclic_update(root, update_function):
    temperatures = random.sample(list(range(20, 35)), 7)
    update_function(temperatures)
    root.after(1000, lambda: cyclic_update(root, update_function))


def main():
    root = tk.Tk()
    update_function = setup_weather_display(root)
    cyclic_update(root, update_function)
    root.mainloop()

if __name__ == '__main__':
    main()

Lacsap93
User
Beiträge: 23
Registriert: Mittwoch 20. November 2019, 08:50

Danke ihr beiden. Ich werde das frühestens morgen ausprobieren können.
Ich freue mich schon drauf :-)
Lacsap93
User
Beiträge: 23
Registriert: Mittwoch 20. November 2019, 08:50

@__deets__ wozu sind den die beiden "f" in

Code: Alles auswählen

description = tk.Label(frame, text=f"Tag {self._offset}")
und in

Code: Alles auswählen

 day.update(f"{temp}C")
Wenn ich diese im Programm lasse, gibt es mir einen Fehler und wenn ich sie rauslösche, dann ist das Programm lauffähig, aber es werden keine Werte angezeigt nur ein Fenster in dem 7x steht "Tag {self._offset}{temp}C"
Die Anzahl hängt ja damit zusammen:

Code: Alles auswählen

    days = [WetterProTag(i) for i in range(7)]
und das ist ja auch das, was mir Sirius geschrieben hat.

Aber wo muss ich denn nun die Verlinkung von der anderen Klasse (Wetter Übersicht) machen, damit das Programm weiss, welche Tages-Details es öffnen muss.
Leider habe ich bei deinem Programm überhaupt keinen Durchblick was ich wo, wie und warum einfügen muss, dass es zu meinem Programm passt.
Ich versuche aber noch den Durchblick zu erhalten
Fire Spike
User
Beiträge: 329
Registriert: Montag 13. Mai 2019, 16:05
Wohnort: Erde

der fstring funktioniert erst ab Python3.6 und höher.
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Deine Python-Version ist zu alt, als dass sie f-Strings kennen würde. Da es das aber schon seit einigen Jahren gibt, solltest Du mal ein Update in Erwägung ziehen.

Dein Programm ist so verquer, dass es kaum zu retten ist. Fang einfach mit __deets__` Vorlage frisch an.
Antworten