Parameter in verschiedenen Umgebungen

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
peter99
User
Beiträge: 84
Registriert: Samstag 3. August 2013, 21:32

NameError: global name 'stable' is not defined
Das ist der error, den ich gerade bekomme. ich musste ein paar aenderungen an meinem code durchfuehren, weswegen ich jetzt zwei files einlese, um dadurch die geschwindigkeit zu steigern, da eines kuerzer ist.
eines besitzt den namen
Q_A_Sym_ME_A_abu_stable
das andere den namen
Q_A_Sym_ME_A_abu_unstable
Das eine enthaelt nur die stabilen, das andere auch die instabilen elemente.
beide haben das gleiche format, die gleiche information und sind gleich aufgebaut(das eine hat mehr elemente und das andere weniger) um den code etwas zu kuerzen, wollte ich nun dies machen:
ich bin als erstes nicht sicher, wie ich zugriff auf ein wort habe, das unter anfuehrungszeichen steht
infile = open("C:\Python27\Q_A_Sym_ME_A_abu_" + "property" + ".txt",'r')
Ausserdem habe ich wieder das Problem, dass stable und unstable keine globalen Namen sind.

Code: Alles auswählen

def readcontaminationfile(property):
    #can be added if you want to change rhe file fname = raw_input("Please enter a filename.txt ")
    infile = open("C:\Python27\Q_A_Sym_ME_A_abu_" + "property" + ".txt",'r')
    info_property = (column.strip().split() for column in infile)
    x_property = zip(*info)
    Qcont_property = map(int,x[0])
    Around_property = map(int, x[1])
    A1_property = map(float,x[4])
    nameiso_property = x[2]
    abu_property = x[5]
    qdivbya_property = [float(b)/float(m) for b,m in zip(Qcont,A1)]
    abu2_property = map(float, abu)
    information_property = zip(qdivbya,Qcont,A1,nameiso,abu2)
    return Qcont_property, A1_property, Around_property, nameiso_property, abu_property, qdivbya_property, abu2_property, information_property

def main():
    Qcont_stable, A1_stable, Around_stable, nameiso_stable, abu_stable, qdivbya_stable, abu2_stable, information_stable = readcontaminationfile(stable)
    Qcont_unstable, A1_unstable, Around_unstable, nameiso_unstable, abu_unstable, qdivbya_unstable, abu2_unstable, information_unstable = readcontaminationfile(unstable)
    cavmaxCSS, cavmaxreal, factor = readcavmaxfile()
    phi, Qin, A, E, diffE, minimumf, maximumf, Vebitmax, check2, check1, check3, check4, checks,\
           number, numbers, diffqa0, cavlist, combo = getInputs(A1, Around, nameiso, Qcont, factor)
    alarm(cavlist, cavmaxCSS, number)
    Qout, fieldout, numberout, Energyout = decision(phi, Qin, A, E, diffE, minimumf, maximumf, Vebitmax, checks, \
             number, numbers, cavlist, factor, cavmaxCSS, cavmaxreal)
    clickrow(Qcont, A1, nameiso, qdivbya, abu2, information, A, diffqa0, check3, check4, factor, 
             phi, minimumf, maximumf, cavmaxreal, combo,
             Qcont_stable, A1_stable, Around_stable, nameiso_stable, abu_stable, qdivbya_stable, abu2_stable, information_stable,
             Qcont_unstable, A1_unstable, Around_unstable, nameiso_unstable, abu_unstable, qdivbya_unstable, abu2_unstable, information_unstable)

def contaminationcalc(property):                
    result = []
    for a,b,c,d,e in zip(qdivbya_property,Qcont_property,nameiso_property, A1_property,abu2_property):
        diffqa = abs(beamqdivbya - a )
        if diffqa < diffqa0:
            diffqaoverqa = float(diffqa)/float(Qchosen)* A
            result.append(a)
            set_cells(table1, len(result)-1, c, b, d, a, diffqaoverqa, e)


def clickrow(Qcont, A1, nameiso, qdivbya, abu2, information, A, diffqa0, check3, check4, factor, phi, minimumf, maximumf, cavmaxreal, combo,
             Qcont_stable, A1_stable, Around_stable, nameiso_stable, abu_stable, qdivbya_stable, abu2_stable, information_stable,
             Qcont_unstable, A1_unstable, Around_unstable, nameiso_unstable, abu_unstable, qdivbya_unstable, abu2_unstable, information_unstable):

# Qchosen gets chosen before but this part is not import for here
    if combo == "stable":
        contaminationcalc(stable)
    if combo == "unstable":
        contaminationcalc(unstable)

if __name__ == '__main__': main()
lunar

Oh Gott, bitte lese Dir das Tutorial durch. Du scheinst tatsächlich zu erwarten, dass aus "qdivbya_property" irgendwie magisch "qdivbya_stable" wird, wenn Du "property" nur irgendwie als "stable" übergeben könntest. So funktioniert Python nicht, und diese Annahme deutet auf so grundlegende Missverständnisse im Bezug auf Python, dass wir Dir nicht sinnvoll helfen können. Bitte, lies das Tutorial, mindestens bis zum Punkt, an dem Wörterbücher (aka "dictionaries") vorgestellt werden. Ein solches musst Du hier nämlich verwenden.
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Wie soll Python auf magische Weise wissen, dass »property« in »nameiso_property« durch »stable« ersetzt werden soll und nicht etwa »name« durch »peter«?
Du solltest wirklich mal dringend aufräumen: Dinge, die zusammengehören, also »qcont«,»Around«,»nameiso« usw. speichert man nicht in 15 verschiedenen Listen sondern in einem Objekt, das dann nur eine Liste ergibt:

Code: Alles auswählen

class ContaminationEntry(object):
    def __init__(self, qcont, around, nameiso, unknown, a1, abu):
        self.qcont = int(qcont)
        self.around = int(around)
        self.nameiso = nameiso
        self.a1 = float(a1)
        self.abu = float(abu)
        
    @property
    def qdivbya(self):
        return self.qcont/self.a1
    
    def calc_diffqa(self, beamadivbya):
        return abs(beamadivbya - self.qdivbya)

def readcontamination(filename):
    with open(filename) as infile:
        return [ContaminationEntry(line.split()) for line in infile]

def main():
    contaminations = {}
    for cproperty in ("stable","unstable"):
        contaminations[cproperty] = readcontamination(r"C:\Python27\Q_A_Sym_ME_A_abu_%s.txt"%cproperty)
    …
    clickrow(combo, contaminations, beamadivbya, diffqa0, qchosen, A, table1)


def filter_contamination(contamination, beamadivbya, diffqa0):
    "filters all contamination entries with diffqa < diffqa0"
    for contamination_entry in contamination:
        diffqa = contamination_entry.calc_diffqa(beamadivbya)
        if diffqa < diffqa0:
            yield diffqa, contamination_entry

def contaminationcalc(contamination, beamadivbya, diffqa0, qchosen, A, table):
    filtered = filter_contamination(contamination, beamadivbya, diffqa0)
    for index, (diffqa, contamination_entry) in enumerate(filtered):
        diffqaoverqa = float(diffqa)/float(qchosen) * A
        set_cells(table, index,
            contamination_entry.nameiso,
            contamination_entry.qcont,
            contamination_entry.a1,
            contamination_entry.qdivbya,
            diffqaoverqa,
            contamination_entry.abu
            )


def clickrow(combo, contaminations, beamadivbya, diffqa0, qchosen, A, table):
    contaminationcalc(contaminations[combo], beamadivbya, diffqa0, qchosen, A, table)

if __name__ == '__main__':
    main()
Und in "C:\Python27" gehören definitiv keine Programmdateien!
peter99
User
Beiträge: 84
Registriert: Samstag 3. August 2013, 21:32

vielen dank! classes sind etwas mit dem ich mich noch nicht naeher beschaeftigt habe, aber wenn mein Job vorbei ist, werde ich es definitiv tun.
peter99
User
Beiträge: 84
Registriert: Samstag 3. August 2013, 21:32

@Sirius
Ich weiß, ich komme spät darauf zurück, aber nun habe ich endlich etwas Zeit mich näher damit zu beschäftigen. Mein Problem ist, dass der wirklich sehr schöne code nicht funktioniert, ich probieren schon seit geraumer Zeit ihn anzupassen, aber das Vernetzen von contaminations mit ContaminationEntry und einlesen in init funktioniert nicht. Es kommt als erstes zu einem TypeError, weil init zu wenig Argumente bekommt.
Aber prinzipiell ist es vermutlich eine gute Idee die contamination-Einträge mit einem dictionary zu verknüpfen. Mit Klassen klappts daweil bei mir nicht.
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Es sollte wohl auch so heißen:

Code: Alles auswählen

def readcontamination(filename):
    with open(filename) as infile:
        return [ContaminationEntry(*line.split()) for line in infile]
peter99
User
Beiträge: 84
Registriert: Samstag 3. August 2013, 21:32

sorry, aber es funktioniert immer noch nicht. es nimmt contaminations immer noch als ein argument und gibt
TypeError: __init__() takes exactly 7 arguments (1 given)
zurück.
der code ist(lang, ich weiß):

Code: Alles auswählen

from org.csstudio.opibuilder.scriptUtil import PVUtil
from org.csstudio.opibuilder.scriptUtil import FileUtil
from org.csstudio.swt.widgets.natives.SpreadSheetTable  import ITableSelectionChangedListener
from java.util import Arrays
from org.csstudio.opibuilder.scriptUtil import ColorFontUtil
RED = ColorFontUtil.getColorFromRGB(255,0,0)
# import math for later calculations in imported data
import os

from math import cos, pi as PI, sin, sqrt
from string import*
table_calc = display.getWidget("Table").getTable()
table_cont = display.getWidget("Table1").getTable()
C_0 = 299792458.0
BETA_S = 0.041
G_EFF = 0.067539767
#big letter because LAMDA seems to be predefined
LAMDA = 3.724129913
Qout = []
numberout = []
Energyout = []
fieldout = []
cavmaxFilename = FileUtil.workspacePathToSysPath("/CSS/cavmax_CSS_real.txt")
#QAFilename = FileUtil.workspacePathToSysPath("/CSS/Q_A_Sym_ME_A_abu.txt")


def compute_energy(number, A, phi,  k, cavlist, Vebit, Vebitmax, cavmaxCSS, factor, BETA_S):
    condition_energy = (
    all(t < u for t, u in zip(cavlist, cavmaxCSS)) 
    )
    E0 = 600
    for s in range(1,number + 1):
        # 10**(-16), because keV
        beta = sqrt(2 * E0 * 1.602177 * 10**(-16) / 1.6726 * 10**27) /C_0
        tmp = PI * G_EFF / (beta * LAMDA)
        T = sin(tmp) / tmp * sin(PI * BETA_S / (2 * beta))
        E0 = E0 + (k*27.98*cavlist[s-1]/factor[s-1])/A*T*cos(phi)
    if condition_energy:
        Qout.append(k)
        set_cells(table_calc, len(Qout) - 1, k, Vebit, number, E0)
    else:
        refresh()
 
def compute_field(number_chosen, A, phi, Q_calc, Vebit, Vebitmax, cavmaxreal, factor, BETA_S, minimumf, maximumf, diffE, E):
    E_average = (600 + E)/2
    v_averge = sqrt(2*E_average*1.602177*10**(-16)/1.6726*10**27)
    beta_average = v_averge/C_0
    tmp = PI * G_EFF / (beta_average * LAMDA)
    T_average = sin(tmp)/tmp*sin(PI*BETA_S/(2*beta_average))
    fieldreal = diffE*A/(27.98*Q_calc*float(number_chosen)*T_average*cos(phi))
    condition_field = (
    fieldreal > minimumf and fieldreal < maximumf and all(fieldreal < u for u in cavmaxreal)
    )
    if condition_field:
        Qout.append(Q_calc)
        fieldout.append(fieldreal)
        numberout.append(number_chosen)
        Energyout.append(E)
        set_cells(table_calc, len(Qout) - 1, k, Vebit, s, E)
        field_computation = zip(Qout, fieldreal, number_chosen, E)
        #yield field_computation
    #info_for_click = zip(Qout, fieldout, numberout, Energyout)
    return Qout, fieldout, numberout, Energyout #info_for_click              
          
class ContaminationEntry(object):
    def __init__(self, qcont, around, nameiso, unknown, a1, abu):
        self.qcont = int(qcont)
        self.around = int(around)
        self.nameiso = nameiso
        self.a1 = float(a1)
        self.abu = float(abu)
        
    @property
    def qdivbya(self):
        return self.qcont/self.a1
        
    def calc_diffqa(self):
        class SelectionListener(ITableSelectionChangedListener):
            def selectionChanged(self, selection):
                text=""
                for row in selection:
                    i=0
                    for s in row:
                        text += s;
                        if i != (len(row)-1):
                                text += " "
                        i+=1
                    text1 = text.split()
                        
                    qchosen = float(text1[0])
                    number = float(text1[2])
                    energy = float(text1[3])
                    beamqdivbya = qchosen/A
                    for a, b in self.qcont, self.a1:
                        diffqa = abs(beamqdivbya - a/b)
        return diffqa, qchosen
    
def readcontamination(filename):
    infile = open(filename)
    return [ContaminationEntry(*column.split()) for column in infile]

def main():
    contaminations = {}
    for cproperty in ("stable","all"):
        contaminations[cproperty] = readcontamination(r"C:\Python27\Q_A_Sym_ME_A_abu_%s.txt"%cproperty)
    cavmaxCSS, cavmaxreal, factor = readcavmaxfile()
    phi, Qin, A, E, diffE, minimumf, maximumf, Vebitmax, check2, check1, check3, check4, checks,\
           number, numbers, diffqa0, cavlist, combo = getInputs(ContaminationEntry, factor)
    alarm(cavlist, cavmaxCSS, number)
    Qout, fieldout, numberout, Energyout = decision(phi, Qin, A, E, diffE, minimumf, maximumf, Vebitmax, checks, \
             number, numbers, cavlist, factor, cavmaxCSS, cavmaxreal)
    clickrow(combo, contaminations, diffqa0, qchosen, A)

def readcavmaxfile():
    infile = open(cavmaxFilename,'r')
    info = (column.strip().split() for column in infile)
    x = zip(*info)
    cavmaxCSS = map(float,x[0])
    cavmaxreal = map(float,x[1])
    factor = [b/m for b,m in zip(cavmaxCSS, cavmaxreal)]
    return cavmaxCSS, cavmaxreal, factor
    
#define function that writes values in cells

def set_cells(table_cont, row, *args):
    for i, value in enumerate(args):
        table_cont.setCellText(row, i, str(value))
        
# define function that refreshes output
def refresh():        
    table_calc.setContent([[" ", " ", " ", " "]])
    table_cont.setContent([[" ", " ", " ", " ", " ", " "]])


def getInputs(ContaminationEntry, factor):
    Element = str(display.getWidget("Element").getValue())
    Aput = float(display.getWidget("A").getValue()) 
    for ContaminationEntry.around, ContaminationEntry.nameiso, ContainationEntry.qcont, ContaminationEntry.a1 in ContaminationEntry:
    	if A_ == Aput and b == Element:
            A = d
            display.getWidget("Qin").getPV().setValue(c)
            Qin = c
    E = float(display.getWidget("E").getValue())
    diffE = E -600
    minimumf = float(display.getWidget("minimumf").getValue())
    maximumf = float(display.getWidget("maximumf").getValue())
    Vebitmax = float(display.getWidget("Vebitmax").getValue())
    phase = float(display.getWidget("phase").getValue())
    phi = - phase *PI/180
    check2 = display.getWidget("check2").getValue()
    check1 = display.getWidget("check1").getValue()
    check3 = display.getWidget("check3").getValue()
    check4 = display.getWidget("check4").getValue()
    checks = [check1, check2, check3, check4]
    number = float(display.getWidget("number").getValue())
    minnumber = float(display.getWidget("minnumber").getValue())
    maxnumber = float(display.getWidget("maxnumber").getValue())
    numbers = range(minnumber, maxnumber + 1)
    cav1 = float(display.getWidget("cav1").getValue())
    cav2 = float(display.getWidget("cav2").getValue())
    cav3 = float(display.getWidget("cav3").getValue())
    cav4 = float(display.getWidget("cav4").getValue())
    cav5 = float(display.getWidget("cav5").getValue())
    cav6 = float(display.getWidget("cav6").getValue())
    cavlist = [cav1, cav2, cav3, cav4, cav5, cav6]
    resolve = float(display.getWidget("resolve").getValue())
    diffqa0 = 1/resolve
    combo = str(display.getWidget("Combo").getValue()) 
# give back real fields of cavities
    for i in range(1,7):
        x = cavlist[i-1]/factor[i-1]
        display.getWidget("cav" + str(i) + "real").setValue(x)
    return phi, Qin, A, E, diffE, minimumf, maximumf, Vebitmax, check2, check1, check3, check4, checks,\
           number, numbers, diffqa0, cavlist, combo

def alarm(cavlist, cavmaxCSS, number):
    for i in range(1, number + 1):
        if number >= i and cavlist[i-1] > cavmaxCSS[i-1]:
            display.getWidget("cav" + str(i)).setPropertyValue("foreground_color",RED)
           

def decision(phi, Qin, A, E, diffE, minimumf, maximumf, Vebitmax, checks, \
             number, numbers, cavlist, factor, cavmaxCSS, cavmaxreal):

    Q = range(1 , Qin + 1, 1)
    for i in Q:
        Vebit = 12*A/i   
# Ist possibility: fixed number, compute Energy
        if Vebit < Vebitmax and checks == [1, 0, 0, 1]:
            compute_energy(number, A, phi,  i, cavlist, Vebit, Vebitmax, cavmaxCSS, factor, BETA_S)
            Qout, fieldout, numberout, Energyout = 0,0,0,0
            # does not provide any information - not needed

        elif Vebit < Vebitmax and checks == [1, 0, 1, 0]:
            Qout, fieldout, numberout, Energyout  = compute_field(number, A, phi,  i, Vebit, Vebitmax, cavmaxreal, factor, BETA_S, minimumf, maximumf, diffE, E)

        elif Vebit < Vebitmax and checks == [0, 1, 1, 0]:
            for j in numbers:
                Qout, fieldout, numberout, Energyout  = compute_field(j, A, phi,  i, Vebit, Vebitmax, cavmaxreal, factor, BETA_S, minimumf, maximumf, diffE, E)
               
   	else:
            refresh()
    return Qout, fieldout, numberout, Energyout
   


def filter_contamination(contamintions, bea, diffqa0):
    "filters all contamination entries with diffqa < diffqa0"
    for contaminations_entry in ContaminationEntry:
        diffqa = ContaminationEntry.calc_diffqa
        if diffqa < diffqa0:
            yield diffqa, ContaminationEntry

def clickrow(ContaminationEntry, diffqa0, qchosen, A):
    filtered = filter_contamination(ContaminationEntry, diffqa0)
    for index, (diffqa, ContaminationEntry) in enumerate(filtered):
        diffqaoverqa = float(diffqa)/float(qchosen) * A
        set_cells(table_cont, index,
            ContaminationEntry.nameiso,
            ContaminationEntry.qcont,
            ContaminationEntry.a1,
            ContaminationEntry.qdivbya,
            diffqaoverqa,
            contaminationEntry.abu
            )
	
if __name__ == '__main__': main()
Zuletzt geändert von peter99 am Donnerstag 12. September 2013, 15:51, insgesamt 1-mal geändert.
BlackJack

@peter99: Dann ist die Frage wie die Eingabedatei an der Stelle aussieht. Wie sind die Werte getrennt? Gibt es Zeilen mit weniger als 6 Werten? Zum Beispiel Leerzeilen?
peter99
User
Beiträge: 84
Registriert: Samstag 3. August 2013, 21:32

Nein, das gibt es nicht, aja, sorry, bei mir ist es natürlich ContaminationEntry(*column.split()) for column in infile ... habe schlecht kopiert, aber der error bleibt der gleiche. Ich habe eine saubere txt.-datei mit 6 spalten und diese 6 spalten sollen eingelesen werden--> in Listen. (das wurden sie auch vorher bevor ich den code geändert habe problemlos.
Mit diesem Absatz.

Code: Alles auswählen

def readcontaminationfile():
    #can be added if you want to change rhe file fname = raw_input("Please enter a filename.txt ")
    infile = open(QAFilename,'r')
    info = (column.strip().split() for column in infile)
    x = zip(*info)
    Qcont = map(int,x[0])
    Around = map(int, x[1])
    A1 = map(float,x[4])
    nameiso = x[2]
    abu = x[5]
    qdivbya = [float(b)/float(m) for b, m in zip(Qcont,A1)]
    abu2 = map(float, abu)
    information = zip(qdivbya,Qcont,A1,nameiso,abu2)
    return Qcont, A1, Around, nameiso, abu, qdivbya, abu2, information
Also an den files kanns nicht liegen.
Vielen Dank dennoch, ich bin für jeden Hinweis dankbar!
BlackJack

@peter99: Das die Zeilen `column` genannt werden, ist ein wenig verwirrend. Und die ganzen Redundanzen. `abu` enthält die gleichen Daten wie `abu2` nur einmal als Zeichenketten und einmal als Gleitkommazahlen. In `information` ist noch mal viel drin was auch sonst schon von der Funktion zurückgegeben wird.

Und wie es aussieht schaffst Du dort ein Problem was Du an anderer Stelle wieder durch `zip()` löst. Wenn Du hier nicht die Spalten in einzelne Listen mit parallelen Daten umwandeln würdest, bräuchte man die an anderer Stelle dann nicht wieder transponieren.
peter99
User
Beiträge: 84
Registriert: Samstag 3. August 2013, 21:32

Ja, so fraglich das Vorgehen war, was sich hauptsächlich auf try and error begründet, so funktioniert es doch. Das andere funktioniert nicht, es wäre jedoch sehr schön, wenn ich den anderen code in meinen einbauen könnte und meinen code damit verbessern würde, bzw. auch das implementieren könnte, was mit dem alten code nicht so leicht funktionieren würde.
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Durch einfaches Prüfen läßt sich leicht herausfinden, warum eine Zeile nicht 6 Spalten hat:

Code: Alles auswählen

import logging
def readcontamination(filename):
    result = []
    with open(filename) as infile:
        for line in infile:
            columns = line.split()
            if len(columns)!=6:
                logging.warn('Line has not 6 columns: %r'%columns)
            else:
                result.append(ContaminationEntry(*columns))
    return result
Zum Rest: »compute_energy« sollte wirklich nur eine Energie berechnen und nicht auch noch unnötigerweise gleich irgendwelche Tabellen füllen:

Code: Alles auswählen

ELEMENTAR_LADUNG = 1.602177e-16 # in mC
PROTON_MASSE = 1.6726e-27 # in kg

def compute_energy(A, phi,  k, cavlist, factors, BETA_S):
    E0 = 600
    for cav, factor in zip(cavlist, factors):
        # 10**(-16), because keV
        beta = sqrt(2 * E0 *  ELEMENTAR_LADUNG / PROTON_MASSE) /C_0
        tmp = PI * G_EFF / (beta * LAMDA)
        T = sin(tmp) / tmp * sin(PI * BETA_S / (2 * beta))
        E0 += (k*27.98*cav/factor)/A*T*cos(phi)
    return E0
Und statt des compute_energie aufrufs müßtest Du das schreiben:

Code: Alles auswählen

    condition_energy = all(t < u for t, u in zip(cavlist, cavmaxCSS)) 
    if condition_energy:
        Qout.append(k)
        E0 = compute_energy(A, phi,  k, cavlist[:number], factor[:number], BETA_S)
        set_cells(table_calc, len(Qout) - 1, k, Vebit, number, E0)
    else:
        refresh()
Die Klasse in »calc_diffqa« sieht seltsam aus. Was willst Du damit bezwecken?
Was soll der Parameter ContaminationEntry in getInputs? Und die for-Schleife?
Warum gibst Du sowohl »checks« also auch »check2«, »check1« usw. einzeln zurück?
peter99
User
Beiträge: 84
Registriert: Samstag 3. August 2013, 21:32

Ich weiß,dass die Klasse in calc_diffqa seltsam aussieht, aber da ist eine Schnittstelle zum GUI, weil je nachdem, welche Zeile man anklickt, passiert, wählt es ein gewisses Q, eine gewisse Energie, etc. aus. ich verstehe es selbst nicht ganz und habe mich an einem Beispiel orientiert- unbefriedigende Antwort, ich weiß.
Das mit ContaminationEntry habe ich vergessen wieder umzuändern, hab etwas rumexperimientiert, da der code nicht funktioniert hat.
Die for-schleife soll das prüfen, ob das inpt-A und das input-Element in der Liste von Isotopen vorkommen und dann die zugehörige Ordnungszahl zurückgeben.
Ich gebe checks zurück und check3 und check4 brauche ich wieder später, in einem Teil in clickrow, der hier nichts beiträgt.
Danke im Vorraus,
Peter
peter99
User
Beiträge: 84
Registriert: Samstag 3. August 2013, 21:32

Okay, langsam bewegt sich etwas- der Code funktioniert schon mal wieder teilweise.
Das Problem mit den line.split() hat sich aufgelöst.. mir ist bis jetzt nicht klar, was das Problem war und da ich meiner Meinung nach nichts geändert habe (aber natürlich war es irgendein Fehler von mir).. aber egal, es funktioniert.
nächste Probleme:

Der code funktioniert zwar(wenn ich eine verkürzte Form wähle und nicht den unten angegebenen Part in getInputs einbaue), tut jedoch nicht mehr das verlangte--> daher er gibt nicht die Kontimination bei Klick auf eine Zeile in der anderen Tabelle an.
Er befüllt die Table table_cont also nicht!

Außerdem wollte ich eine ähnliche (zu der Struktur von clickrow) Struktur oben in getInputs einbauen, die auch nicht funktioniert, ..:

Code: Alles auswählen

def getInputs(contaminations, factor):
    Element = str(display.getWidget("Element").getValue())
    A = float(display.getWidget("A").getValue()) 
    for contamination_entry in contaminations:
    	if contamination_entry.around == Aput and contamination_entry.nameiso == Element:
            A = contamination_entry.a1
            display.getWidget("Qin").getPV().setValue(contamination_entry.qcont)
            Qin = contamination_entry.qcont
...
...
...
Ich bekomme da immer einen
File "<script>", line 147, in getInputs
TypeError: 'type' object is not iterable
in der
for contamination_entry in contaminations:
Zeile

Entschuldige, dass ich euch so viel damit nerve, aber ich bin mit dictionarys und Klassen schon sehr weit aus meiner comfort-zone draußen. Vielen Dank im Vorraus, Peter
Zuletzt geändert von peter99 am Freitag 13. September 2013, 09:57, insgesamt 3-mal geändert.
BlackJack

@peter99: Die Antwort auf die Frage mit den `checks` lässt mich so ein bisschen daran zweifeln ob Du den Sinn der Frage verstanden hast. Das Du die Checkboxen beim Aufrufer brauchst erklärt doch nicht warum Du die selbe Information zweimal zurück gibst, wo einmal völlig genügen würde. Das ist ja im Grunde der gleiche Unsinn wie bei der `readcontaminationfile()` wo auch die gleichen Werte mehrfach zurückgegeben werden.

Edit: Der `NameError` für `contamination_entry` ist ziemlich offensichtlich ein Tippfehler in der Schleifenvariablen. Die muss natürlich `contamination_entry` heissen.
peter99
User
Beiträge: 84
Registriert: Samstag 3. August 2013, 21:32

Ja, sorry, das habe ich auch gerade gesehen- habe gerade den post geändert.
okay zu den checks: mir ist klar, dass ich die gleiche Information 2mal zurückgebe. in einem anderen part des codes brauche ich noch check3 and check4, der nun nicht enthalten ist.
das heißt check1 and check2 könnte ich locker streichen. Im Endeffekt könnte ich auch nur checks verwenden, wenn ich wüsste, wie man bei checks setzt, dass check1 and check2 beliebig sein können. dann könnte ich nämlich eine checks-struktur im späteren code verwenden mit check3 and check4 fixiert und check1 and check2 beliebig.
Ich hoffe, dass das jetzt weniger schwammig war?
peter99
User
Beiträge: 84
Registriert: Samstag 3. August 2013, 21:32

Eine Frage: wie werden die Einträge der Klasse in das dictionary eingelesen? weil eigentich gibt die readcontamination-funktion ja Einträge an die Klasse zurück, wird dann aber in der main-Funktion so zurückgegeben, dass sie das dictionary zurückgibt?
Vielen Dank!
Antworten