Wie Variable aus Funktion bringen um im "main" nutzen zu können

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
xXSkyWalkerXx1
User
Beiträge: 379
Registriert: Mittwoch 27. Juni 2018, 17:39

Ich habe ne Funktion, die die Variable "shootrate" wiedergeben soll, damit die Variable "script" sie im Hauptkörper der Datei (also nicht in der Funktion) nutzen kann.
Die Funktion sieht so aus:

Code: Alles auswählen

def rapidfireSettings():
    titleLabel["text"] = "RapidFire"
    titleLabel.pack(side="top",pady=12)
    previewLabel.pack(pady = 65)
    info1Label.pack()
    info2Label.pack(pady=25)
    setting1Label.pack()
    setting2Label.pack()
    on.pack()
    off.pack()
    setting3Label["text"] = "Geschwindigkeit:"
    setting3Label.pack()
    entry1.pack()

    entry2.pack_forget()
    setting4Label.pack_forget()
    entry3.pack_forget()
    setting5Label.pack_forget()

    shootrate = entry1.get()
    return shootrate
    
... Und die Variable "script" im Hauptkörper:

Code: Alles auswählen

script =   "int shoot_rate         = "+str(shootrate)+"; " 
Doch mit return klappt das iwie nicht und globalisieren möchte ich sie auch nicht, aufgrund es mehrere Variablen gibt, die auf entry1 zugreifen und "script" eigentlich größer/längerer Text ist.
Das ist nur ein kleiner Ausschnitt - vom Wesentlichen.

Danke für die Hilfe in Vorraus, besonders an "__deets__" wahrscheinlich wieder! ^^
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

@xXSkyWalkerXx1: .. und das wesentliche fehlt. Wo wird denn rapidfireSettings (sollte eigentlich rapidfire_settings heißen) aufgerufen und wo die script-Variable gesetzt.

Es macht keinen Sinn, den Wert von entry1 sofort nach dem Erzeugen abzufragen, dann da ist es noch leer. Statt lange Scripts mit Strings zusammenzustückeln solltest Du eine Template-Engine in Erwägung ziehen.
xXSkyWalkerXx1
User
Beiträge: 379
Registriert: Mittwoch 27. Juni 2018, 17:39

Sirius3 hat geschrieben: Donnerstag 5. Juli 2018, 15:58 @xXSkyWalkerXx1: .. und das wesentliche fehlt. Wo wird denn rapidfireSettings (sollte eigentlich rapidfire_settings heißen) aufgerufen und wo die script-Variable gesetzt.

Es macht keinen Sinn, den Wert von entry1 sofort nach dem Erzeugen abzufragen, dann da ist es noch leer. Statt lange Scripts mit Strings zusammenzustückeln solltest Du eine Template-Engine in Erwägung ziehen.
Zu deiner Frage, wo die Funktion aufgerufen wird:

Code: Alles auswählen

# Hauptfenster - Widgetplatzierung:
generateButton.pack(pady=12)
infoLabel1.pack(pady=12)
layoutButton.pack(pady=8)
infoLabel2.pack(pady=12)
aimbotButton.pack(pady=8)
aimassistButton.pack(pady=8)
norecoilButton.pack(pady=8)
rapidfireButton.pack(pady=8) #Hier, per Knopfdruck
jitterButton.pack(pady=8)
autorunButton.pack(pady=8)
Davor wird natürlich erstmal der Button beschrieben:

Code: Alles auswählen

rapidfireButton = tkinter.Button(frameLeft, text = "RapidFire", command = rapidfireSettings)
Eine Template Engine - hm, weiß nicht.

Und zu deiner Aussage: "Es macht keinen Sinn, den Wert von entry1 sofort nach dem Erzeugen abzufragen, dann da ist es noch leer.":
Die Entry soll erst abgefragt werden, wenn eine integer eingetragen wurde.
Müsste das so aussehen?

Code: Alles auswählen

if entry1.get() == int(entry1.get()):
	shootrate = entry1.get()
Benutzeravatar
__blackjack__
User
Beiträge: 13111
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Das ``return`` macht in der `rapidfire_settings()` keinen Sinn wenn es von der GUI-Hauptschleife aufgerufen wird. Die kann mit so einem Rückgabewert nichts anfangen. Du wirst hier um objektorientierte Programmierung nicht herum kommen.

Das Entry darf erst abgefragt werden wenn der Benutzer etwas eingetragen hat. Meistens ist es ja so das man das dadurch erkennt das er eine Schaltfläche drückt wenn er fertig ist und das eingetragene dann verarbeitet werden soll.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
xXSkyWalkerXx1
User
Beiträge: 379
Registriert: Mittwoch 27. Juni 2018, 17:39

__blackjack__ hat geschrieben: Donnerstag 5. Juli 2018, 17:01 Das Entry darf erst abgefragt werden wenn der Benutzer etwas eingetragen hat. Meistens ist es ja so das man das dadurch erkennt das er eine Schaltfläche drückt wenn er fertig ist und das eingetragene dann verarbeitet werden soll.
Würde das so aussehen müssen, wenn die Entry auf eine integer warten soll...

Code: Alles auswählen

if entry1.get() == int(entry1.get()):
	shootrate = entry1.get()
???
xXSkyWalkerXx1
User
Beiträge: 379
Registriert: Mittwoch 27. Juni 2018, 17:39

xXSkyWalkerXx1 hat geschrieben: Donnerstag 5. Juli 2018, 17:11
__blackjack__ hat geschrieben: Donnerstag 5. Juli 2018, 17:01 Das Entry darf erst abgefragt werden wenn der Benutzer etwas eingetragen hat. Meistens ist es ja so das man das dadurch erkennt das er eine Schaltfläche drückt wenn er fertig ist und das eingetragene dann verarbeitet werden soll.
Würde das so aussehen müssen, wenn die Entry auf eine integer warten soll...

Code: Alles auswählen

if entry1.get() == int(entry1.get()):
	shootrate = entry1.get()
???
Und wegen OOP - naguuut. ^^ Aber warum eigentlich genau OOP?
Benutzeravatar
__blackjack__
User
Beiträge: 13111
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Es gibt da keinen Code den man an *einer* Stelle schreibt der das macht. Du erstellst an einer Stelle ein Entry und eine Schaltfläche, und in dem Code der auf das betätigen der Schaltfläche reagiert, rufst Du dann den Inhalt des Entry ab. Und weil *der* Code das Entry dafür kennen muss, und dann wahrscheinlich auch ein Model/Programmlogik die diesen Wert dann für irgend etwas verwenden, braucht man OOP. Alternative wären Closures, aber in Python ist der Weg über OOP der normale.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
xXSkyWalkerXx1
User
Beiträge: 379
Registriert: Mittwoch 27. Juni 2018, 17:39

Aber eins verstehe ich nicht, was haben die doppelten Unterstriche vor und nach einem Funktionnamen zu tun?
Benutzeravatar
__blackjack__
User
Beiträge: 13111
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@xXSkyWalkerXx1: Die gehören halt zu den Namen. Das sind oder sollten nur Namen sein die eine Bedeutung für Python haben, also keine die man sich selbst ausdenkt. Die konkreten Namen kann man in der Python-Dokumentation nachlesen.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
xXSkyWalkerXx1
User
Beiträge: 379
Registriert: Mittwoch 27. Juni 2018, 17:39

Achsooo... Danke! :D
xXSkyWalkerXx1
User
Beiträge: 379
Registriert: Mittwoch 27. Juni 2018, 17:39

Und was hat es damit auf sich?
...was hat das für ein Zweck?
...tut es die Klasse aufrufen?

Code: Alles auswählen

if __name__ == "__main__":
    main()
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Antworten