Frage von arnebepunkt, 19

Python-Programmierung: Werte von einem Def-Teil an den anderen übergeben?

Hallo Hallo,

also: Ich habe ein kleines Programm geschrieben, in dem ich drei Buttons habe. Jeder Button hat seine eigene Funktion, die in einem Def-Part beschrieben werden. Der erste Button soll eine Binär-Datei öffnen und einlesen (funktioniert), die anderen beiden Buttons sollen unterschiedliche Funktionen mit den eingelesenen Daten machen. Nun ist es dummerweise so, dass die Variable, in die ich die Datei einlese, am Ende der Funktion wieder auf ihren Ursprungswert zurückgesetzt wird, was wohl für Python eine normale Funktion ist, wenn man es nicht richtig macht. Frage ist jetzt: Wie mache ich es richtig? Wie kann ich der Prozedur sagen, dass die Werte bestimmter Variablen global geändert werden sollen?

Zur Info: Ein bisschen was an Programmiererfahrung habe ich, und mit Python versuche ich seit gestern, im Grundsätzlichen klarzukommen. Also bitte habt ein wenig Rücksicht, wenn meine Problembeschreibung und die Nachfragen mich als Newbie kenntlich machen.

Danke!

Antwort
von coding24, 18

Kannst du nicht einfach ein Stückchen Quellcode "sharen"? Dann kann man dir besser antworten.

Kommentar von arnebepunkt ,
from tkinter import *
import binascii

fenster = Tk()
fenster.title("xxx")
fenster.geometry("500x300")
inhalt = 1

buttonDecomp1 = Button(fenster, text="Decompress 1", state=DISABLED)

def load_rom():
file_path = filedialog.askopenfilename()
buttonDecomp1.config(state="normal")
ROM = open(file_path, "rb")
inhalt = int.from_bytes(ROM.read(1), byteorder="little")
if inhalt == 0x18:
inhalt = int.from_bytes(ROM.read(1), byteorder="little")
if inhalt == 0xFB:
print("Successful")
else:
print("Wrong ROM")
ROM.close()
print(inhalt)
return inhalt

def decomp1():
print("a")
print(inhalt)

buttonLoadROM = Button(fenster, text="Load ROM",command=load_rom)
buttonLoadROM.pack()
buttonDecomp1.pack()
buttonDecomp1.config(command=decomp1)

mainloop()
Kommentar von coding24 ,

Du erstellst dir hier innerhalb der Funtkion load_rom eine lokale Variable "inhalt". die ist nur im Scop dieser Funktion verwendbar.

Entweder definierst du die Variable jetzt als globale Variable - oder du machst es so, wie man es richtig und sauber macht:

Du übergibst den "Inhalt" in der Signatur der weiteren Funtkionen als Argument. Das return inhalt hast du ja in der load_rom()-Funktion schon drinnen.

Zum Thema globale Variable:

http://www.inf-schule.de/programmierung/imperativeprogrammierung/konzepteimp/nam...

Kommentar von arnebepunkt ,

Erstmal: Ganz lieben Dank für die Info! Hier der aktuelle Code, so recht funktioniert es nicht:

from tkinter import *
import binascii

fenster = Tk()
fenster.geometry("500x300")
inhalt = 1

buttonDecomp1 = Button(fenster, text="Decompress 1", state=DISABLED)

def load_rom(inhalt):
file_path = filedialog.askopenfilename()
buttonDecomp1.config(state="normal")
ROM = open(file_path, "rb")
compareArray1 = [0x18, 0xFB, 0x78, 0xD8, 0x4B, 0xAB, 0xE2, 0x20, 0xC2, 0x10, 0xA2, 0xFF, 0x1F, 0x9A, 0xF4, 0x00]
for x in compareArray1:
inhalt = int.from_bytes(ROM.read(1), byteorder="little")
if inhalt == x:
print("In that file Byte", x, "is where it has to be")
else:
print("Tot is")
break
ROM.close()
print(inhalt)
return(inhalt)

def decomp1():
print("a")
print(inhalt)

buttonLoadROM = Button(fenster, text="Load ROM",command=load_rom(inhalt))
buttonLoadROM.pack()
buttonDecomp1.pack()
buttonDecomp1.config(command=decomp1)

mainloop()

(Ich habe da jetzt eine For-Schleife reingehauen, aber die hat damit im Endeffekt nichts damit zu tun - der Code sieht jetzt nur ein wenig anders aus)

Ich dachte, ich hätte "inhalt" schon als globale Variable definiert, weil ich sie direkt nach "fenster" oben mit irgendeinem Wert versehen habe. Jetzt habe ich beim def-Part den Inhalt reingegeben und unten, wenn ich dem Button die Funktion zuweise, übergebe ich auch "inhalt". Wenn ich jetzt den buttonDecomp1 drücke, spuckt mir das Programm trotzdem weiterhin "1" aus, während es mir beim finalen print(inhalt) bei load_rom einen anderen Wert ausspuckt. Außerdem, was ich mysteriös finde, ist, dass load_rom jetzt automatisch bei Programmstart ausgeführt wird und nicht mehr auf den Button-Klick wartet. Kann mir wer dabei noch helfen?

Kommentar von coding24 ,

Lies einfach mal den Inhalt der Webseite, die ich dir gepostet habe.

Du musst direkt nach def load_rom(inhalt): erst einmal ein "global inhalt" hinzufügen, um "inhalt" als globale Variable zu deklarieren - zumindest wenn du nicht mit dem Rückgabewert der Variablen weiterarbeiten willst.

Ansonsten übergibst du "decomp1" natürlich immernoch keinen Wert, den du vorher von load_rom zurückbekommen hast.

Dass du beim "command"-Parameter eine Funktion mit Signatur übergeben kannst - da bin ich mir nicht sicher. Da bin ich auch zu wenig GUI-Programmierer in Python.

Laut Stackoverflow klappt das nicht ganz so, wie ich es gedacht habe: http://stackoverflow.com/questions/13099908/python-tkinter-return-value-from-fun...

Aber du kannst natürlich weiterhin einen Setter aufrufen, welcher für dich den Value setzt - oder eben mit der globalen Variablen arbeiten (weiter oben). War dann mein Fehler, dass es mit Return-Values nicht funktioniert :)

Keine passende Antwort gefunden?

Fragen Sie die Community