1 positional argument but 2 were given

Fragen zu Tkinter.
Antworten
Fredddd
User
Beiträge: 17
Registriert: Mittwoch 10. Mai 2017, 11:05

Hallo Ihr,
ich moechte mit meinem Pi Messwerte ausgeben , ein 7" Display verwenden und habe auch ein Programm zum laufen gebracht.
Nun wurde mir gesagt Globale Variablen sind boese und dein Code sieht nicht geordnet aus, es sollte Objekt orientiert sein.
Als Neuling in OO selbst erstellen habe ich da meine Probleme.
viele Fehler habe ich mit ausprobieren schon geschafft. Probieren deshalb weil ich einfach nicht dahinter komme muss ich self.master , master udgl. verwenden. Ich wolle nur ein"Fenster" verwenden und habe jetzt self , master und noch self.master.

Hier der error (und es sind sicher noch zig versteckt)
Traceback (most recent call last):
File "ccdpoo.py", line 106, in <module>
win.read_every_second ()
File "ccdpoo.py", line 83, in read_every_second
self.readoneortwo=self.READ(self.readoneortwo)
TypeError: READ() takes 1 positional argument but 2 were given

Code: Alles auswählen

#!/bin/python3

import tkinter
import grovepi
import math
import time
from tkinter import Tk, Label, Button

class mainscreen:
    def __init__(self,master):
        self.master = master
        master.title ("Temperature")
        master.geometry("800x480")
        master.attributes("-fullscreen", False)
        self.state = False

        sensorTH1 = 4
        sensorTH2 = 3
        temp1=0
        temp2=0
        

        #column0 and 1
        self.labeltemp11 = tkinter.Label (master, text="Temp inside", fg="black", font="72")
        self.labeltemp11.grid(row=1, column=0 ,sticky="sw")
        self.labeltemp1 =tkinter.Label (master, text="", fg="black", font="72")
        self.labeltemp1.grid(row=1, column=1,sticky="sw")
        self.labelhum11 = tkinter.Label(master, text="Hum inside", fg="black",  font="72")
        self.labelhum11.grid(row=2,column=0,sticky="sw")
        self.labelhum1 = tkinter.Label (master, text="",fg="black", font="72")
        self.labelhum1.grid(row=2, column=1,sticky="sw")
        self.labeltemp22 = tkinter.Label (master, text="Temp outside", fg="black",font="72")
        self.labeltemp22.grid(row=3, column=0,sticky="sw")
        self.labeltemp2 = tkinter.Label (master, text="", fg="black",  font="72")
        self.labeltemp2.grid(row=3, column=1,sticky="sw")
        self.labelhum22 = tkinter.Label(master, text="Hum outside", fg="black",  font="72")
        self.labelhum22.grid(row=4,column=0,sticky="sw")
        self.labelhum2 = tkinter.Label (master, text="", fg="black",  font="72")
        self.labelhum2.grid(row=4, column=1,sticky="sw")
        #win.focus_set()
        #win.bind("t",toggle_fullscreen(win))
        self.button= tkinter.Button(master, text="No fullscreen", width=10,command=lambda:self.toggle_fullscreen())
        #works as well button= tkinter.Button(win, text="No Fullscreen", width=10,command=toggle_fullscreen)
        self.button.grid(column=0,row=5,sticky="nsew")

        #column2 empty
        self.labelemp1 = tkinter.Label (master, text="", fg="black", width="10" ,bg="white" , font="72")
        self.labelemp1.grid(row=0, column=2,sticky="sw")
        self.labelemp2 = tkinter.Label (master, text="test", fg="black", width="10",bg="black" , font="72")
        self.labelemp2.grid(row=0, column=3,sticky="sw")



    def READ(toggle):
        if toggle:
            [temp1,humidity1] = grovepi.dht(sensorTH1,1)
            self.labeltemp1.configure(text= "{value:6.2f} C".format( value=temp1))
            self.labelhum1.configure(text= "{value:6.2f} %".format( value=humidity1))
            print ("temp1 =", temp1, " humidity1 =", humidity1) #py3
           
        else: 
            #time.sleep(1)
            [temp2,humidity2] = grovepi.dht(sensorTH2,1)
            self.labeltemp2.configure(text= "{value:6.2f} C".format( value=temp2))
            self.labelhum2.configure(text= "{value:6.2f} %".format( value=humidity2))
            print ("temp2 =", temp2, " humidity2 =", humidity2) #py3


            toggle= not toggle
            #print (toggle)
            return(toggle)
        

        

       

    def read_every_second(self):
        #global readoneortwo not needed after object oriented programming
        #win.attributes("-fullscreen", False)
        #toggle_fullscreen(win)
        readoneortwo=self.READ(readoneortwo)
        master.after(1000, read_every_second)

        # can be used with call of button lamda: toggle_fullscreen (win) or any other window?
        #def toggle_fullscreen(self, event=None):
        #        self.state = not self.state  # Just toggling the boolean
        #        print ("test")
        #        self.attributes("-fullscreen", self.state)
        #        return "break"


    def toggle_fullscreen(self, event=None):
        self.state = not self.state  # Just toggling the boolean
        if self.state:
            self.button["text"]="No Fullscreen"
        else:
            self.button["text"]="Fullscreen"
            self.attributes("-fullscreen", master.state)
        return "break"    

if __name__ == '__main__':
    root = tkinter.Tk()
    win = mainscreen(root)
    #win.read_every_second ()
    root.mainloop()
Ich wollte euch bitten ob ihr mir sagen koennt ob es irgendwie einfacher geht das ich das verstehe .
zb. was ich halbwegs verstehe waere

Code: Alles auswählen

def __init__(self):
Ich denke dann haette ich nur eine Moeglichkeit um zu bestimmen wo die Dinge angezeigt werden sollten.

Weiter fehlt mir irgendwie der Plan meine Messungen zu trennen von der graphischen Darstellung.
es sollen noch einige Sensoren und auch eine Steuerung fuer einen Gleichstrommotor kommen. (aber erst dachte ich das Einfache)
herzlichen Danke
PS: mir hat schon geholfen deutsch python Programme zu studieren weil hier eindeutig zu sehen ist was is selbst definiert und was vorgegeben.
Danke
Roman
Zuletzt geändert von Anonymous am Mittwoch 10. Mai 2017, 11:40, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
As a Man Thinketh
BlackJack

@Fredddd: Du übergibst dort zwei Argumente, eins implizit weil Du die Methode aufrufst und bei Methoden auf Objekten immer das Objekt *selbst* als erstes Argument übergeben wird, und dann noch ``self.readoneortwo`` laut Traceback oder ``readoneortwo`` laut Quelltext, der aber keines von beiden definiert, also an der Stelle eine andere Ausnahme schon *vor* dem Aufruf auslöst. Auf jeden Fall erwartet die Methode laut Signatur nur ein Argument. Vergleich die doch mal mit den anderen Methoden, wo Du es ja richtig gemacht hast.

Im Quelltext sind aber noch andere Probleme mit Namen und Sichtbarkeits-/Gültigkeitsbereichen. `sensorTH1`, `sensorTH2`, `temp1`, und `temp2` in der `__init__()` werden definiert, aber nicht verwendet. Dafür werden die ersten beiden Namen in `READ()` verwendet ohne das sie definiert sind. Und in `toggle_fullscreen()` wird ein nicht existierendes `master` verwendet.

Der ``lambda``-Ausdruck beim `command`-Argument bei der Schaltfläche ist übrigens unnötig umständlich. Die anonyme Funktione ohne Argumente ruft einfach nur eine Methode ohne Argumente auf — da kann man auch direkt die Methode als Argument verwenden.

Die mit ``from tkinter import …`` importieren Namen werden nicht verwendet — die Zeile kann weg. Weder `math` noch `time` werden verwendet, die Importe können auch wegfallen.

``return`` ist keine Funktion, sollte also auch nicht so geschrieben werden als wäre es ein Funktionsaufruf.

Was Namenschreibweisen und Leerzeichensetzung angeht lohnt sich ein Blick in den Style Guide for Python Code.
Fredddd
User
Beiträge: 17
Registriert: Mittwoch 10. Mai 2017, 11:05

@BlackJack, Danke fuer deine rasche Antwort....lese die jetzt schon 100mal ...
@Fredddd: Du übergibst dort zwei Argumente, eins implizit weil Du die Methode aufrufst und bei Methoden auf Objekten immer das Objekt *selbst* als erstes Argument übergeben wird, und dann noch ``self.readoneortwo`` laut Traceback oder ``readoneortwo`` laut Quelltext, der aber keines von beiden definiert, also an der Stelle eine andere Ausnahme schon *vor* dem Aufruf auslöst. Auf jeden Fall erwartet die Methode laut Signatur nur ein Argument. Vergleich die doch mal mit den anderen Methoden, wo Du es ja richtig gemacht hast.
eine Methode ist alles mit "def" nehme ich an??.... ich wollte einfach eine bolean uebergeben....welches bei den anderen Methoden nicht der Fall ist...finde da wirklich nicht wo ich etwas richtig gemacht habe und warum, sorry...newbie
Daher Hilft es mir leider nicht eine Loesung zu finden! :!:
Im Quelltext sind aber noch andere Probleme mit Namen und Sichtbarkeits-/Gültigkeitsbereichen. `sensorTH1`, `sensorTH2`, `temp1`, und `temp2` in der `__init__()` werden definiert, aber nicht verwendet. Dafür werden die ersten beiden Namen in `READ()` verwendet ohne das sie definiert sind. Und in `toggle_fullscreen()` wird ein nicht existierendes `master` verwendet.
Ich dachte diese wuerden wie globale Variablen funktionieren (innerhalb einer class ) und definiert hier in allen "Methoden" zur Verfuegung stehen... :K
der master der nicht existiert loeste fuer mich einen error (sagte ja ich muss probieren ) , jedoch funktioniert diese Methode ? erst beim zweiten klick des Buttons. :oops:
Der ``lambda``-Ausdruck beim `command`-Argument bei der Schaltfläche ist übrigens unnötig umständlich. Die anonyme Funktione ohne Argumente ruft einfach nur eine Methode ohne Argumente auf — da kann man auch direkt die Methode als Argument verwenden.
Auch hier habe ich einen Error geloest indem ich solange probierte wie es funktioniert....
Die mit ``from tkinter import …`` importieren Namen werden nicht verwendet — die Zeile kann weg. Weder `math` noch `time` werden verwendet, die Importe können auch wegfallen.
Das wusste ich nicht, ich dachte alles was ich verwende muesste ich vorher importieren. um nicht * zu verwenden... math und time wurde zum testen mal verwendet...ist einfach stehen geblieben...
``return`` ist keine Funktion, sollte also auch nicht so geschrieben werden als wäre es ein Funktionsaufruf.
dh. ich kann es einfach weglassen , wie gebe ich dann etwas zurueck?
Was Namenschreibweisen und Leerzeichensetzung angeht lohnt sich ein Blick in den Style Guide for Python Code.
Danke, ein kleines Beispiel zu deinem guten LINK waere nett gewesen...ich schwimme sowieso schon ordentlich...
As a Man Thinketh
BlackJack

@Fredddd: Eine Methode ist eine Funktion die im Klassenkörper definiert ist und damit an die Objekte gebunden ist, die aus der Klasse erstellt werden. Sonst wäre es einfach nur eine Funktion. Arbeite doch mal das Tutorial in der Python-Dokumentation durch.

Du schaust Dir die Methoden an und siehst nicht was alle anderen ausser `READ()` gemeinsam haben? Das Objekt *selbst* wird als erstes Argument bei Methoden übergeben. Und bei allen anderen Methoden hast Du einen Parameter dafür, nur bei `READ()` nicht.

Lokale Namen funktionieren auch in Methoden genau so wie in Funktionen. Wenn das so funktionieren würde wie Du das vermutest, dann müsste man ja höllisch aufpassen was man in Methoden für Namen verwendet damit man nicht in verschiedenen Methoden die gleichen Namen verwendet und dadurch dann Probleme entstehen könnten. Das wäre ja noch schlimmer als ``global`` wenn alle Namen innerhalb einer Klasse überall sichtbar wären. Der Sinn von Funktionen und Methoden ist ja gerade dass das in sich geschlossene Einheiten sind, wo man sich anschauen kann was übergeben und zurückgegeben wird, und man damit weiss worauf sich das auswirken kann, und auch worauf (sehr wahrscheinlich) nicht.

Wenn man etwas in anderen Methoden verwenden will, muss man das als Attribut an das Objekt binden, was ja jeder Methode als erstes Argument übergeben wird. Dabei sollte man darauf achten dass man möglichst nur in der `__init__()` neue Attribute definiert, damit das Objekt nach der Initialisierung vollständig und möglichst auch benutzbar ist. Sonst wird der Code schnell unübersichtlich und fehleranfällig.

Die Schaltfläche funktioniert nicht beim zweiten mal, sondern ”funktioniert” jedes zweite mal, denn nur jedes zweite mal wird versucht das undefinierte, lokale `master` zu verwenden. ”Funktioniert” in Anführungstrichen weil es bei jedem zweiten mal keine Ausnahme gibt, aber da auch nur der Text der Schaltfläche geändert wird und nicht die Vollbirdschirm-Option.

Man muss alles definieren bevor man es verwenden kann, also zum Beispiel von woanders importieren. Du verwendest aber nirgends die Namen `Label` oder `Button`. Immer nur `tkinter` und da dann halt die Objekte in dem Modul über Attributzugriff.

Nein Du kannst das ``return`` nicht weglassen, aber das ist halt keine Funktion die man aufruft, sondern ein Schlüsselwort dem ein Wert folgen kann. Also ohne diese unnötigen Klammern und dann auch noch ohne Leerzeichen.
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

@fredddd:

Der Fehler geschieht in Zeile 82. Da steht:

Code: Alles auswählen

readoneortwo=self.READ(readoneortwo)
Das ist dasselbe wie:

Code: Alles auswählen

readoneortwo=mainscreen.READ(self,readoneortwo)
Aber READ hat nur einen Parameter namens 'toogle'. Das ist sehr schlechter Stil. Du kannst ja nennen wie Du willst, aber üblicherweise sollte der 'self' heißen. Und wenn Du einen weiteren Parameter brauchtst, dann mußt Du ihn nach dem 'self' Parameter hinzufügen.
Fredddd
User
Beiträge: 17
Registriert: Mittwoch 10. Mai 2017, 11:05

@BlackJack & Alfons, Danke!!!! vielen Dank fuer Eure Zeit! es wird es wird...ich denke ich weiss was ich jetzt suchen muss um es zu verstehen....
frueher wurden in Funktionen auch Werte uebergeben nur ist dies fuer mich mit sehr verwirrend...

das komische der Code einfach wie frueher programmiert funktioniert ...OOrientiert ist fuer mich schwer :x

Achja:
Die Schaltfläche funktioniert nicht beim zweiten mal, sondern ”funktioniert” jedes zweite mal, denn nur jedes zweite mal wird versucht das undefinierte, lokale `master` zu verwenden. ”Funktioniert” in Anführungstrichen weil es bei jedem zweiten mal keine Ausnahme gibt, aber da auch nur der Text der Schaltfläche geändert wird und nicht die Vollbirdschirm-Option.
auch der Bildschirm wird fullscreen oder not fullscreen :mrgreen: und es funktioniert nur beim ersten klick nicht gleich...sonst schon... bekomme keine Fehlermeldung!

Habe gerade nachgelesen wegen Attributen...gerade entdeckt ...es gibt ClassenElemente und ObjectElemente , fuer mich war beides gleich :oops:

schoen langsam daemmert es mir ...jetzt weiss ich warum manchmal unerschiedlich angesprochen wird, weil einmal Class_Elemente veraendert werden und einmal Object_Elemente....darum auch self_Namen und manchmal mit Class_Namen .. :idea:

Ich werde das schon hinbekommen...weiss nur nicht wie lange es dauert...
As a Man Thinketh
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

@Fredddd:was ist denn mit diesen Zeilen?

Code: Alles auswählen

        self.master = master
        master.title ("Temperature")
        master.geometry("800x480")
        master.attributes("-fullscreen", False)
        self.state = False

        sensorTH1 = 4
        sensorTH2 = 3
        temp1=0
        temp2=0
Bei der Zeilennummer muß man noch 10 dazuzählen, damit die Codezeile in Deinem Script herauskommt.

Also in Zeile 11 ist definierst Du ein self.master
In den Zeilen 12 bis 14 greift Du auf einen übergebenen master zu. Nur was ist dann mit dem ersten master? Den kannst Du nicht übergeben. Da solltest Du vielleicht schreiben:

def __init__(self,master=None):

und dann weiter:

Code: Alles auswählen

if master:
        master.title("Temperature")
        master.geometry("800x480")
        master.attributes("-fullscreen", False)
else:
       self.title ("Temperature")
       self.geometry("800x480")
       self.attributes("-fullscreen", False)
Aber der Sinn ist mir dafür unklar. Was bezweckst Du damit? Willst Du alle Objekte mit diesen Werten initialisieren? Warum schreibst Du dann nicht gleich statt master.title self.title?

Oder soll nur für das root Objekt das aufgerufen werden, dann wäre richtig:

Code: Alles auswählen

if not master:
       self.title ("Temperature")
       self.geometry("800x480")
       self.attributes("-fullscreen", False)
In den die Zeilen 17 bis 20 hast Du sinnlose lokale Variablen, die nac h Ausführung von __init__ nicht mehr existieren. Wahrscheinlich hattest Du gemeint self.SensorTH1 usw.
Das wären dann Objektattribute, die auch nach Ausführung von __init__ weiter existieren und auf die man zugreifen kann.

Allerdings scheinst Du etwas nicht zu verstehen. Nämlich: die Klasse hat keine Klassenvariablen, sondern es handelt sich bei self.name immer um ein Objektattribut, nämlich das Attribute jenes Objektes, das durch den Parameter self übergeben wird.

Und wenn Du ein neues Objekt anlegst, wird es von Python erzeugt und dann __init__ aufgerufen mit dem neuen Objekt als self.
Fredddd
User
Beiträge: 17
Registriert: Mittwoch 10. Mai 2017, 11:05

Die Zeile 11 usw ist entstanden weil ich Probleme mit den Variablen (Attributen?) im Objekt hatte ...habe gelesen man muss diese dem Objekt übergeben und das dies so geht ..darum meine Frage die ich schon stellte ob es nicht einfacher geht mit class xxx (self)
es ist entstanden da ich immer einen Error bekam das auf eine Variable zugegriffen wird die vorher nicht definiert wurde.

Ich versuchte einfach einen Schirm zu erzeugen (ohne frame , mit dem kannte ich mich nicht aus) wo ich eine Anzeige der Sensoren und auch eine Eingabe platzieren kann. 12,13,14,15 sind die Bildschirmgrösse etc. Attribute


ich verwende einen GrovePi und die Variablen sind die Sensor-pin Nummern und Temperatur Variablen.

Ja ich bin schon darauf gekommen das ich mit Attributen Klasse oder Objekt nicht so richtig auf du und du bin :-)

ich gebe mal meinen Code dazu der funktioniert aber nicht OOrientiert ist...diesen versuchte ich umzubauen.

Code: Alles auswählen

#!/bin/python3
debug = False

if  debug:
    import random  # test only
else:
    import grovepi
# add import tkinter (python3)
import tkinter
import math
import time


#toggle was necessary because dht22 temp/hum read one after another within same second = problems


sensorTH1 = 4
sensorTH2 = 3
temp1=0
temp2=0
readoneortwo=True


win = tkinter.Tk()
win.title("Temperature")
win.geometry("800x480")
win.attributes("-fullscreen", True)  #true if start with fullscreen

#column0 and 1
labeltemp11 = tkinter.Label (win, text="Temp inside", fg="black", font="72")
labeltemp11.grid(row=1, column=0 ,sticky="sw")
labeltemp1 = tkinter.Label (win, text="", fg="black", font="72")
labeltemp1.grid(row=1, column=1,sticky="sw")
labelhum11 = tkinter.Label (win, text="Hum inside", fg="black",  font="72")
labelhum11.grid(row=2, column=0,sticky="sw")
labelhum1 = tkinter.Label (win, text="", fg="black", font="72")
labelhum1.grid(row=2, column=1,sticky="sw")
labeltemp22 = tkinter.Label (win, text="Temp outside", fg="black", font="72")
labeltemp22.grid(row=3, column=0,sticky="sw")
labeltemp2 = tkinter.Label (win, text="", fg="black",  font="72")
labeltemp2.grid(row=3, column=1,sticky="sw")
labelhum22 = tkinter.Label (win, text="Hum outside", fg="black",  font="72")
labelhum22.grid(row=4, column=0,sticky="sw")
labelhum2 = tkinter.Label (win, text="", fg="black",  font="72")
labelhum2.grid(row=4, column=1,sticky="sw")
#win.focus_set()
#win.bind("t",toggle_fullscreen(win))
button= tkinter.Button(win, text="No fullscreen", width=10,command=lambda:toggle_fullscreen())
#works as well button= tkinter.Button(win, text="No Fullscreen", width=10,command=toggle_fullscreen)
button.grid(column=0,row=5,sticky="nsew")

#column2 empty
labelemp1 = tkinter.Label (win, text="", fg="black", width="10" ,bg="white" , font="72")
labelemp1.grid(row=0, column=2,sticky="sw")
labelemp2 = tkinter.Label (win, text="test", fg="black", width="10",bg="black" , font="72")
labelemp2.grid(row=0, column=3,sticky="sw")



def READ(toggle):
        
        if toggle:
            [temp1,humidity1] = grovepi.dht(sensorTH1,1)
            labeltemp1.configure(text= "{value:6.2f} C".format( value=temp1))
            labelhum1.configure(text= "{value:6.2f} %".format( value=humidity1))
            print ("temp1 =", temp1, " humidity1 =", humidity1) #py3
           
        else: 
            #time.sleep(1)
            [temp2,humidity2] = grovepi.dht(sensorTH2,1)
            labeltemp2.configure(text= "{value:6.2f} C".format( value=temp2))
            labelhum2.configure(text= "{value:6.2f} %".format( value=humidity2))
            print ("temp2 =", temp2, " humidity2 =", humidity2) #py3


        toggle= not toggle
        #print (toggle)
        return(toggle)
        

        

       

def read_every_second():
    global readoneortwo
    #win.attributes("-fullscreen", False)
    #toggle_fullscreen(win)
    readoneortwo=READ(readoneortwo)
    win.after(1000, read_every_second)

# can be used with call of button lamda: toggle_fullscreen (win) or any other window?
#def toggle_fullscreen(self, event=None):
#        self.state = not self.state  # Just toggling the boolean
#        print ("test")
#        self.attributes("-fullscreen", self.state)
#        return "break"

def toggle_fullscreen():
        win.state = not win.state  # Just toggling the boolean
        if win.state:
            button["text"]="No Fullscreen"
        else:
            button["text"]="Fullscreen"
        win.attributes("-fullscreen", win.state)
        #return "break"    

#added () to call the function
read_every_second ()     


win.mainloop()
As a Man Thinketh
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

@fredddd: Warum machst Du es nicht so, daß Du Deine mainscreen Klasse von der Root Klasse ableitest?

Code: Alles auswählen

class mainscreen(Tk):
    def __init__(self):
        Tk.__init__(self)
        self.title ("Temperature")
        self.geometry("800x480")
        self.attributes("-fullscreen", False)
        self.state = False
 
        self.sensorTH1 = 4
        self.sensorTH2 = 3
        self.temp1=0
        self.temp2=0

        # ...

if __name__ == '__main__':
    mainscreen.mainloop()
Damit brauchst Du keinen master, der verwirrt hier nur.
Fredddd
User
Beiträge: 17
Registriert: Mittwoch 10. Mai 2017, 11:05

Verstehe ich das richtig du verwendest als root Klasse TK von tkinter ....aber zeile 3 ist mir nicht klar....

Ich haette

Code: Alles auswählen

    class mainscreen:
        def __init__(self):
        self.tkinter.title ("Temperature")
so irgendwie (ich weiss nicht ob das stimmt)
As a Man Thinketh
BlackJack

@Fredddd: Da stimmt natürlich nicht. Du hast da eine Klasse die von nichts abgeleitet wird, also damit implizit von `object`, und versuchst dann auf ein `tkinter`-Attribut auf so einem Objekt zuzugreifen das nirgends definiert wurde. Wo soll denn das herkommen? `object` hat das nicht und Deine Klasse definiert das vorher auch nicht.
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

Fredddd hat geschrieben:Verstehe ich das richtig du verwendest als root Klasse TK von tkinter ....aber zeile 3 ist mir nicht klar....

Ich haette

Code: Alles auswählen

    class mainscreen:
        def __init__(self):
        self.tkinter.title ("Temperature")
so irgendwie (ich weiss nicht ob das stimmt)
Nein es muss sein:

Code: Alles auswählen

class mainscreen(Tk):
    def __init__(self):
        Tk.__init__(self)
        self.title('Temperature')
Zu Zeile 1: ich leite von der Basisklasse Tk ab
Zu Zeile 2: wenn ich ein eigenes __init__ definiere, wird das eigene __init__ aufgerufen, aber nicht das der Basisklasse
Zu Zeile 3: also muß ich das __init__ der Basisklasse selber aufrufen
Zu Zeile 4: meine Klasse ist die abgeitete Tk Klasse und wenn ich da etwas darin aufrufe, was ich nicht selber definiert habe, wird die entsprechende Methode der Basisklasse, also die von Tk aufgerufen. Dafür hat man ja Klassen: damit man erbt!
Fredddd
User
Beiträge: 17
Registriert: Mittwoch 10. Mai 2017, 11:05

Danke fuer deine grossartige Hilfe, werde es nach deinen Angaben umarbeiten. Ich hoffe ich komme mit den Argumenten klar.
schoenen TAG!
As a Man Thinketh
Antworten