Permalänk
Medlem

Python statement

Hej,

Hur kontrollerar jag ett statement ex. ett bool True/False utan att funktionen går igång i Python, jag vill att den går igång efter att den kontrollerat så att funktionerna kommer i ordning?.

Tacksam för svar.

def func1(self): res = xbmcgui.Dialog().select(strings(59940), [strings(59906), strings(59908)]) if res < 0: res = xbmcgui.Dialog().yesno(strings(59924), strings(59938)) if res is True: ADDON.setSetting('setup', 'false') exit() else: self.func1() if res == 0: ADDON.setSetting('source', 'test') kb = xbmc.Keyboard('','') kb.setHeading(strings(59941)) kb.setHiddenInput(False) kb.doModal() c = kb.getText() if kb.isConfirmed() else None if c == '': c = None ADDON.setSetting('test', c) return True if c == None: self.func1() elif res == 1: fn = xbmcgui.Dialog().browse(1, strings(59942), '') ADDON.setSetting('test.file', fn) return True if fn == "": self.func1() def func2(self): ... def func3(self): ... def func4(self): ... def exec: self.func1() if self.func1() is True: self.func2() if self.func2() is True: self.func3() if self.func3() is True: self.func4() if self.func4() is True: xbmcgui.Dialog().ok(strings(59924), strings(59961)) exit()

Visa signatur

AMD 7800X3D | ASUS TUF X670E-PLUS | Corsair Vengeance DDR5 32GB EXPO | ASUS TUF 4090 OC 24GB |
Noctua NH-U12A | Corsair 4000D | Corsair AX1200W | Steelseries Apex 7 | Steelseries Sensei Ten | ASUS VG35VQ

https://github.com/Mariusz89B

Permalänk
Hedersmedlem

Oklart vad du menar. Du kan inte kolla om en funktion returnerar True eller False utan att faktiskt köra funktionen. Blir inte klokare av att läsa din kod heller.

Du kan alltid spara returvärdet av en funktion för att kolla det senare. T.ex.:

ret = funktion() ... if ret: print("ret är sann") else: print("ret är falsk")

Du ska inte köra "is True" heller.

Kan du försöka förklara på ett annat sätt vad du vill uppnå?

Permalänk
Medlem

Så som jag har det nu så går alla self.func igång två gånger i def exec.

Visa signatur

AMD 7800X3D | ASUS TUF X670E-PLUS | Corsair Vengeance DDR5 32GB EXPO | ASUS TUF 4090 OC 24GB |
Noctua NH-U12A | Corsair 4000D | Corsair AX1200W | Steelseries Apex 7 | Steelseries Sensei Ten | ASUS VG35VQ

https://github.com/Mariusz89B

Permalänk
Medlem
Skrivet av M89:

Så som jag har det nu så går alla self.func igång två gånger i def exec.

ja, antingen så får du ta bort ett av anropen till funktionen, eller så får du spara värden funktionen returnerar i en variabel och jämnföra mot den variabeln i nästa if-sats.

Visa signatur

CPU: Ryzen 9 3900x Noctua NH-D14 MOBO: TUF Gaming X570-PLUS GPU: GTX 980 RAM: 32 GB 3200 MHz Chassi: R4 PSU: Corsair AX860 Hörlurar: SteelSeries 840 Mus: Logitech G502 Lightspeed V.v. nämn eller citera mig för att få svar.

Permalänk
Hedersmedlem
Skrivet av M89:

Så som jag har det nu så går alla self.func igång två gånger i def exec.

Yes, du anropar dem två gånger.
Byt ut detta:

self.func1() if self.func1() is True: self.func2() if self.func2() is True: ...

Mot:

if self.func1(): if self.func2():

... och så vidare. ("is True" har inget med detta problemet att göra, men gör ingen nytta.)

Visa signatur

Asus ROG STRIX B550-F / Ryzen 5800X3D / 48 GB 3200 MHz CL14 / Asus TUF 3080 OC / WD SN850 1 TB, Kingston NV1 2 TB + NAS / Corsair RM650x V3 / Acer XB271HU (1440p165) / LG C1 55"
Mobil: Moto G200

Permalänk
Medlem

Spara värdet från funktionerna i variabler (booleans), alternativt använd en nästlad if-sats bara. Din if-sats bör se ut såhär isf

if self.func1(): if self.func2(): if self.func3(): if self.func4(): xbmcgui.Dialog().ok(strings(59924), strings(59961)) exit() # behöver du verkligen denna?

Permalänk
Hedersmedlem

Får känslan av en statemaskin

Permalänk
Medlem

Tanken är att ha en tutorial med fyra olika funktioner efter varandra där man väljer olika värden, när allt är valt ska den avslutas. @Skyclaw if-satsen som du skrev fungerar men jag hade behövt att när jag gör en return att den återvänder till föregående funktion, men då får jag argument of type 'NoneType' is not iterable i funktion 2.

Visa signatur

AMD 7800X3D | ASUS TUF X670E-PLUS | Corsair Vengeance DDR5 32GB EXPO | ASUS TUF 4090 OC 24GB |
Noctua NH-U12A | Corsair 4000D | Corsair AX1200W | Steelseries Apex 7 | Steelseries Sensei Ten | ASUS VG35VQ

https://github.com/Mariusz89B

Permalänk
Hedersmedlem
Skrivet av M89:

Tanken är att ha en tutorial med fyra olika funktioner efter varandra där man väljer olika värden, när allt är valt ska den avslutas. @Skyclaw if-satsen som du skrev fungerar men jag hade behövt att när jag gör en return att den återvänder till föregående funktion, men då får jag argument of type 'NoneType' is not iterable i funktion 2.

Hur ser func2 ut?
Det låter som att du gör något som "for x in y" där y är None, dvs saknar värde.

Visa signatur

Asus ROG STRIX B550-F / Ryzen 5800X3D / 48 GB 3200 MHz CL14 / Asus TUF 3080 OC / WD SN850 1 TB, Kingston NV1 2 TB + NAS / Corsair RM650x V3 / Acer XB271HU (1440p165) / LG C1 55"
Mobil: Moto G200

Permalänk
Medlem
Skrivet av M89:

Tanken är att ha en tutorial med fyra olika funktioner efter varandra där man väljer olika värden, när allt är valt ska den avslutas. @Skyclaw if-satsen som du skrev fungerar men jag hade behövt att när jag gör en return att den återvänder till föregående funktion, men då får jag argument of type 'NoneType' is not iterable i funktion 2.

Tror det är lättare om du utförligt (gärna med bilder) berättar vad exakt du tänkt dig ska ske och hur det ser ut.
Jag antar du menar att du har olika steg i din tutorial och vill att man ska kunna gå framåt och bakåt i dem tills man är klar med den del som uppgöras av de fyra olika funktionerna?

Visa signatur

"One is always considered mad, when one discovers something that others cannot grasp."
- Ed Wood

Permalänk
Medlem
Skrivet av Thomas:

Hur ser func2 ut?
Det låter som att du gör något som "for x in y" där y är None, dvs saknar värde.

def func2(self): res = xbmcgui.Dialog().multiselect(strings(59943), [strings(59925), strings(59926), strings(59927), strings(59928), strings(59929), strings(59930), strings(59931), strings(59932), strings(59933), strings(59934), strings(59935), strings(59936), strings(59937)]) if res is None: resBack = xbmcgui.Dialog().select(strings(59924), [strings(59939), strings(30308)]) if resBack < 0: self.func2() if resBack == 0: self.func1() elif resBack == 1: ADDON.setSetting('showForeignChannels', 'false') ADDON.setSetting('tutorial', 'true') exit() if res is not None: resExtra = xbmcgui.Dialog().yesno(strings(59924), strings(59962)) if 0 in res: label = 'Benelux' ADDON.setSetting('showBeneluxChannels', 'true') if resExtra is True: response = xbmcgui.Dialog().yesno(strings(59924), strings(59944).format(label)) if response is True: ADDON.setSetting('source', 'm-TVGuide') kb = xbmc.Keyboard('','') kb.setHeading(strings(59945).format(label)) kb.setHiddenInput(False) kb.doModal() c = kb.getText() if kb.isConfirmed() else None if c == '': c = None ADDON.setSetting('benelux_EPG', c) ADDON.setSetting('showForeignChannels', 'true') if c == None: self.func2() ADDON.setSetting('showBeneluxChannels', 'false') else: None if 1 in res: label = 'Czech' ADDON.setSetting('showCzechChannels', 'true') if resExtra is True: response = xbmcgui.Dialog().yesno(strings(59924), strings(59944).format(label)) if response is True: ADDON.setSetting('source', 'm-TVGuide') kb = xbmc.Keyboard('','') kb.setHeading(strings(59945).format(label)) kb.setHiddenInput(False) kb.doModal() c = kb.getText() if kb.isConfirmed() else None if c == '': c = None ADDON.setSetting('czech_EPG', c) ADDON.setSetting('showForeignChannels', 'true') if c == None: self.func2() ADDON.setSetting('showCzechChannels', 'false') else: None if 2 in res: label = 'German' ADDON.setSetting('showGermanChannels', 'true') if resExtra is True: response = xbmcgui.Dialog().yesno(strings(59924), strings(59944).format(label)) if response is True: ADDON.setSetting('source', 'm-TVGuide') kb = xbmc.Keyboard('','') kb.setHeading(strings(59945).format(label)) kb.setHiddenInput(False) kb.doModal() c = kb.getText() if kb.isConfirmed() else None if c == '': c = None ADDON.setSetting('german_EPG', c) ADDON.setSetting('showForeignChannels', 'true') if c == None: self.func2() ADDON.setSetting('showGermanChannels', 'false') else: None if 3 in res: label = 'Danish' ADDON.setSetting('showDanishChannels', 'true') if resExtra is True: response = xbmcgui.Dialog().yesno(strings(59924), strings(59944).format(label)) if response is True: ADDON.setSetting('source', 'm-TVGuide') kb = xbmc.Keyboard('','') kb.setHeading(strings(59945).format(label)) kb.setHiddenInput(False) kb.doModal() c = kb.getText() if kb.isConfirmed() else None if c == '': c = None ADDON.setSetting('danish_EPG', c) ADDON.setSetting('showForeignChannels', 'true') if c == None: self.func2() ADDON.setSetting('showDanishChannels', 'false') else: None

Blir ganska lång då det är 12 st if statements men skriver ut 3 st...

Visa signatur

AMD 7800X3D | ASUS TUF X670E-PLUS | Corsair Vengeance DDR5 32GB EXPO | ASUS TUF 4090 OC 24GB |
Noctua NH-U12A | Corsair 4000D | Corsair AX1200W | Steelseries Apex 7 | Steelseries Sensei Ten | ASUS VG35VQ

https://github.com/Mariusz89B

Permalänk
Medlem
Skrivet av M89:

Blir ganska lång då det är 12 st if statements men skriver ut 3 st...

Koden är lång för att du har väldigt mycket repeterad kod, du borde fundera på att stoppa sån kod i en funktion så att du inte behöver upprepa allting för varje fall. if c == None:-biten är för övrigt död kod, den kommer aldrig köras eftersom du har en return True precis ovanför.

Sen vet jag inte om det spelar någon roll men du verkar ha stavat fel på showForeginChannels, det borde vara showForeignChannel om det ska vara korrekt engelska.

Permalänk
Hedersmedlem

Hm, det blir väldigt svårt att hänga med i koden. Ett hett tips (om det är din kod från grunden och du inte bara modifierar en mindre del) är att ha mer beskrivande namn på de flesta variablerna och funktionerna. Funktionen "exec" är totalt intetsägande egentligen -- den anropar något, om den returnerar sant anropar det nåt annat, sen visar den en dialog med någon slags text. Kan vara *precis* vad som helst från mitt perspektiv

Det jag var ute efter i func2 var felet ang NoneType, så det intressanta för att kunna lösa det är väl egentligen koden omkring där backtracen visar att felet uppstår. Svårt att hjälpa till med en ovan kodbas när det är så pass mycket kod och man bara har en del.

Visa signatur

Asus ROG STRIX B550-F / Ryzen 5800X3D / 48 GB 3200 MHz CL14 / Asus TUF 3080 OC / WD SN850 1 TB, Kingston NV1 2 TB + NAS / Corsair RM650x V3 / Acer XB271HU (1440p165) / LG C1 55"
Mobil: Moto G200

Permalänk
Medlem
Skrivet av Thomas:

Hm, det blir väldigt svårt att hänga med i koden. Ett hett tips (om det är din kod från grunden och du inte bara modifierar en mindre del) är att ha mer beskrivande namn på de flesta variablerna och funktionerna. Funktionen "exec" är totalt intetsägande egentligen -- den anropar något, om den returnerar sant anropar det nåt annat, sen visar den en dialog med någon slags text. Kan vara *precis* vad som helst från mitt perspektiv

Det jag var ute efter i func2 var felet ang NoneType, så det intressanta för att kunna lösa det är väl egentligen koden omkring där backtracen visar att felet uppstår. Svårt att hjälpa till med en ovan kodbas när det är så pass mycket kod och man bara har en del.

Skrivet av perost:

Koden är lång för att du har väldigt mycket repeterad kod, du borde fundera på att stoppa sån kod i en funktion så att du inte behöver upprepa allting för varje fall. if c == None:-biten är för övrigt död kod, den kommer aldrig köras eftersom du har en return True precis ovanför.

Sen vet jag inte om det spelar någon roll men du verkar ha stavat fel på showForeginChannels, det borde vara showForeignChannel om det ska vara korrekt engelska.

Jag har korrigerat showForeignChannel men det är bara en parameter så den har inte någon större betydelse. Jag provade runt med return True glömde ta bort den.

Ang namn på funktioner så kommer de att ändras så småningom. Jag förstår att det är svårt när man bara ser en del av koden, jag får undersöka saken vidare.

Tack för alla svar!.

Visa signatur

AMD 7800X3D | ASUS TUF X670E-PLUS | Corsair Vengeance DDR5 32GB EXPO | ASUS TUF 4090 OC 24GB |
Noctua NH-U12A | Corsair 4000D | Corsair AX1200W | Steelseries Apex 7 | Steelseries Sensei Ten | ASUS VG35VQ

https://github.com/Mariusz89B