Seite 1 von 2
Textlabel ändert sich nicht
Verfasst: Donnerstag 13. Februar 2020, 12:08
von DL3AD
Hallo,
habe in einem kleinen Testprog versucht ein TextLabel zu beschreiben - tut sich aber nix
Das Prog starten aber ohne Fehler
Was mache ich falsch ?
Code: Alles auswählen
import sys
from PyQt5 import QtWidgets
import form1
class MainWindow(QtWidgets.QMainWindow):
def __init__(self):
super(MainWindow, self).__init__()
self.ui = form1.Ui_MainWindow()
self.ui.setupUi(self)
self.ui.Btn_Calc.clicked.connect(my_hallo) #Btn geklickt dann my_hallo aufrufen
def my_hallo():
MainWindow().ui.Lbl_Erg.text = 'Hallo' # Label Lbl_Erg mit text 'Hallo' beschreiben
def main():
app = QtWidgets.QApplication(sys.argv)
my_form1 = MainWindow()
my_form1.show()
sys.exit(app.exec_())
if __name__ == "__main__":
main()
Re: Textlabel ändert sich nicht
Verfasst: Donnerstag 13. Februar 2020, 12:15
von __deets__
Klassen vs Objekte verhalten sich wie Blaupausen zu danach konstruierten Dingen. Wenn ich dir eine Blaupause eines 3er-BMWs gebe, und du baust einen neuen BMW und oeffnest dessen Tuer - dann gehen ja auch nicht die von dem 3er im Hof die Tuer auf. Genau das tust du aber, wenn du MainWindow() aufrufst - du machst eine NEUE Instanz von MainWindow. Du musst dich aber auf die bestehende beziehen.
Statt eine frei-stehenden Funktion musst du also eine Methode machen. Und einfach ein Attribut setzten funktioniert auch nicht, du musst in die Dokumentation von QLabel schauen, und die richtige Methode raussuchen. Wahrscheinlich setText.
Re: Textlabel ändert sich nicht
Verfasst: Donnerstag 13. Februar 2020, 12:37
von __blackjack__
@DL3AD: Ergänzend: Die Argumente bei `super()` sind überflüssig.
So wie Du den generieren Quelltext (was man nicht macht) mit `MainWindow` über `setupUi()` verbandelst gibt es nun für den ganzen Kram zwei Wege, einmal `self` und dann `self.ui`. Das macht keinen Sinn.
Namen sollten weder abgekürzt werden, noch nummeriert, noch sollte man sinnfreie Prä-/Suffixe wie `my` irgendwo dran pappen. Sich an Namenskonventionen halten wäre auch sinnvoll. Wenn schon nicht an die von Python dann doch wenigstens die von Qt.
Re: Textlabel ändert sich nicht
Verfasst: Donnerstag 13. Februar 2020, 13:17
von DL3AD
... ich komme noch nicht weiter
hier mal ein Beispiel in Pascal
Code: Alles auswählen
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls;
type
{ TForm1 }
TForm1 = class(TForm)
Btn_Calc: TButton;//Button
Lbl_Erg: TLabel; //Label
procedure Btn_CalcClick(Sender: TObject);//Ereignissbehandlung Klick
private
public
end;
var
Form1: TForm1;
implementation
{$R *.lfm}
{ TForm1 }
//Ereignissbehandlung Btn Klick
procedure TForm1.Btn_CalcClick(Sender: TObject);
begin
Lbl_erg.Caption:= 'Hallo'; //Label beschreiben
end;
end.
was müsste im obigen Python Code geändert werden
Re: Textlabel ändert sich nicht
Verfasst: Donnerstag 13. Februar 2020, 13:34
von Sirius3
Methoden in Pascal benutzen implizit die Instanz, auf der sie aufgerufen werden.
`my_hallo` ist aber gar keine Methode, sondern eine frei stehende Funktion. Mach daraus eine Methode und benutze self.ui...
Re: Textlabel ändert sich nicht
Verfasst: Donnerstag 13. Februar 2020, 13:41
von DL3AD
ich probiere schon den ganzen Tag herum,
kanns du mir bitte mal mit der Methode helfen damit ich das Prinzip erkennen kann ?
Re: Textlabel ändert sich nicht
Verfasst: Donnerstag 13. Februar 2020, 13:47
von __blackjack__
Um das Pascal-Programm mal als Ausgangsbeispiel zu nehmen: Ungefähr das hier hast Du in Python versucht: Der Rückruf geht an eine Prozedur/Funktion statt an eine Methode und es wird in der Prozedur nicht auf das existierende Objekt zugegriffen sondern noch mal lokal ein neues erstellt.
Code: Alles auswählen
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls;
type
{ TForm1 }
TForm1 = class(TForm)
Btn_Calc: TButton;
Lbl_Erg: TLabel;
private
public
end;
var
Form1: TForm1;
procedure Btn_CalcClick(Sender: TObject);
implementation
{$R *.lfm}
{ TForm1 }
procedure Btn_CalcClick(Sender: TObject);
var form: TForm1;
begin
form.Lbl_erg.Caption := 'Hallo';
end;
end.
Re: Textlabel ändert sich nicht
Verfasst: Donnerstag 13. Februar 2020, 13:52
von DL3AD
... hmm und wie wir das in Python gemacht ?
Re: Textlabel ändert sich nicht
Verfasst: Donnerstag 13. Februar 2020, 13:56
von __deets__
Habe ich dir doch gesagt. Du musst aus deinem Callback eine METHODE machen. Was das ist wird zB hier beschrieben:
https://docs.python.org/3/tutorial/clas ... at-classes
Re: Textlabel ändert sich nicht
Verfasst: Donnerstag 13. Februar 2020, 14:06
von DL3AD
ist es denn so schwierig für euch Experten mir als Anfänger mal zwei codezeilen als Beispiel zu geben ?
Re: Textlabel ändert sich nicht
Verfasst: Donnerstag 13. Februar 2020, 14:06
von __deets__
Hier mal ein einfaches Beispiel, um das zu illustrieren:
Code: Alles auswählen
class A:
def __init__(self, zahl):
self._zahl = zahl
def methode(self):
print(self._zahl)
instanz_a = A(100)
instanz_b = A(200)
instanz_a.methode()
instanz_b.methode()
A.methode() # das kracht!
Re: Textlabel ändert sich nicht
Verfasst: Donnerstag 13. Februar 2020, 14:11
von __deets__
Und noch ein bisschen weitergehend, mit dem Konzept "gebundene Methode als Rueckruffunktion":
Code: Alles auswählen
callback = instanz_a.methode # OHNE KLAMMERN
callback() # kann spaeter aufgerufen werden, ohne dass man die Instanz verfuegbar haben muss.
Re: Textlabel ändert sich nicht
Verfasst: Donnerstag 13. Februar 2020, 14:22
von __blackjack__
@DL3AD: In dem Tutorial das __deets__ verlinkt hat sind viele Beispiele. Zum ausprobieren und herumspielen um Verständnis und Gefühl dafür zu bekommen. Aber Du willst immer ”Beispiele” die exakt auf Dein Problem passen um die nachmachen zu können, ohne das Du da drüber nachdenken und sie tatsächlich verstehen musst. Wenn man so ”lernt” kann man nichts selber was man nicht schon mal irgendwo gesehen hat und nur leicht anpassen muss. Es würde wirklich Sinn machen erst einmal Python zu lernen und dann Qt. Bevor man sich mit dem Designer Sachen erstellen lässt die man nicht versteht.
@__deets__: Dir ist schon klar das Du da gerade das Tutorial ”abschreibst”, denn genau so ein Beispiel ist da auch drin:
9.3.4. Method Objects
Usually, a method is called right after it is bound:
In the MyClass example, this will return the string 'hello world'. However, it is not necessary to call a method right away: x.f is a method object, and can be stored away and called at a later time. For example:
will continue to print hello world until the end of time.
Aber hey, DL3AD will ja wirklich alles auf dem Silbertablett serviert haben…
Re: Textlabel ändert sich nicht
Verfasst: Donnerstag 13. Februar 2020, 14:23
von __deets__
@__blackjack__: joa, ist mir schon klar. Berg, Prophet - bilden sie einen Satz

Re: Textlabel ändert sich nicht
Verfasst: Donnerstag 13. Februar 2020, 14:27
von __blackjack__
„Der
Prophet wohnt in Kreuz
berg und man darf keine Bilder von ihm malen — sonst Blutbad oder mindestens wütender Mob der irgendwelche Fahnen verbrennt.“

Re: Textlabel ändert sich nicht
Verfasst: Donnerstag 13. Februar 2020, 14:34
von DL3AD
ich möchte nix auf dem Silbertablett haben!
Oben habe ich ein einfaches Beispiel
Wenn dort auf einen Btn geklickt wird soll beispielhaft eine selbst definierte Funktion aufgerufen werden und als Reaktion der Funktion ein Label beschrieben werden.
Meine bitte ist lediglich dieses Beispiel zu ändern dass es funktioniert.
Dass hilft mir dann weiter - ich habe schon stundenlang rumgelesen und probiert.
Ich lerne am besten an selbst gebauten Beispielen.
Also wer ist so nett und hilft mir ?
Re: Textlabel ändert sich nicht
Verfasst: Donnerstag 13. Februar 2020, 14:39
von __deets__
"Ich will nix auf dem Silbertablett haben" und "Meine bitte ist lediglich dieses Beispiel zu ändern dass es funktioniert." sind ein Widerspruch. Denn das *ist* die Loesung auf dem Silbertablett. Und am besten zu lernen, wenn man etwas fertig vorgesetzt bekommt, ist wohl auch nicht so ganz wahr. Da hast du dann deutlich weniger gelernt, als dir die allgemeinen Konzepte der Objektorientierung, die an allen moeglichen Ecken und Enden anzuwenden sind, zu erarbeiten.
Re: Textlabel ändert sich nicht
Verfasst: Donnerstag 13. Februar 2020, 14:52
von DL3AD
Warum willst du mir vorschreiben wie ich etws zu lernen habe ? jeder Mensch ist da anders.
Warum hilfst du mir nicht auf die Art um die ich gebeten hatte ?
Wir haben nun 18 Beiträge auf diesem Faden dass muss doch nich sein.
Also noch mal, ist jemand so nett und hilft mir ?
Re: Textlabel ändert sich nicht
Verfasst: Donnerstag 13. Februar 2020, 14:57
von __deets__
Warum willst du mir vorschreiben, wie ich zu helfen habe? Jeder Mensch ist da anders.
Warum nimmst du die Hilfe nicht an, die dir angeboten wurde?
Wir haben nun 18 Beitraege auf diesem Faden, das muss doch nicht sein.
Also noch mal, bist du so nett und probierst mal zu verstehen, was dir hier gezeigt (Code-Beispiele inklusive) wurde?
Re: Textlabel ändert sich nicht
Verfasst: Donnerstag 13. Februar 2020, 15:08
von DL3AD
Ich habe herumprobier noch und nöcher ich bekomme es nicht hin !
Wer ist so nett und bringt mir das im Eingangspost stehende Beispiel ans laufen ?