Python string Klonen?

  • Hey leute,
    ich habe folgendes Problem:
    Und zwar möchte ich mit Python Daten von einer json API abgreifen. Ich lese erst eine usereingabe ein, setzte dann eine Variable mit der API url, und hänge mit dem + die Variabel mit der Usereingabe hinten dran.
    Danach mache ich per request .get(url) die Abfrage auf die API.
    Problem an der sache ist jetzt, dass sich zwei mal die Tastatur öffnet, und der [definition='1','0']log[/definition] sagt, dass er kein Boolean mit einem String verketten kann. ?(
    Ich vermute, dass mein request beim Variablenaufruf die Variabel quasi refresht, und deshalb die Tastatur aufruft. Im selben moment kommt wahrscheinlich die eingabe (nichts) in die variable und verursacht den Fehler.
    Vielleicht kann ja jemand helfen.

  • Die Fehlermeldung sagt doch alles. Du versuchst 2 Variablen unterschiedlichsten Types (String und boolean) zu verketten. Ich kenne Deinen code jetzt nicht und weis auch nicht was Du machen willst aber wenn es darum geht einen neuen String zu bilden und ein Typ kein String ist, kannst Du den Nichtstring wandeln. Z.B. geht das mit str() also zb String1 = String2 + str(boolean)
    Dann kommt aber sowas raus wie test + True also testTrue wenn der Inhalt von String2 vorher 'test' war.

    Ich denke da liegt eher ein Logikfehler vor.

    Wenn Du Hilfe benötigst, wirst Du wohl den ganzen Code posten müssen.

    Mein Heimkino

    Externer Inhalt www.speedtest.net
    Inhalte von externen Seiten werden ohne Ihre Zustimmung nicht automatisch geladen und angezeigt.
  • Danke schon mal. Den Fehler habe ich schon verstanden. Ist ja auch ziemlich eindeutig, allerdings habe ich das Problem, dass ich den Fehler nur bekomme, wenn ich versuche mit dem verketteten string ein http request zu machen. Lasse ich ihn mir einfach ausgeben, zeigt er mir den richtigen String an. Hier der Code:

    Code
    sSearchText = cGui().showKeyBoard('german')
    url2 = 'http://127.0.0.1:8080/api/movies/' + sSearchText
    url3 = ''
    for x in range(0, len(url2)):
        url3 = url3 + url2[x]
    r = requests.get(url3)
    xbmcgui.Dialog().ok(addonname, url3)

    Url 3 hatte ich erstellt, weil ich gehofft hatte, dass die Tastatur beim request dann nicht erneut aufspringt.

  • Mit python und gui habe ich noch nie etwas gemacht. Aber wenn das Keyboard 2 mal aufgerufen wird, scheint es so zu sein, dass der Programmteil 2 mal aufgerufen wird. Warum auch immer. Das sehe ich jetzt hier nicht.

    Frage doch erstmal ab ob der Rückgabewert einen Inhalt hat. Erst dann machst Du weiter.

    Python
    if not sSearchText:
       xbmc.[definition='1','0']log[/definition]("Fehler:" + str(sSearchText))
    else:
      ...  
      xbmc.[definition='1','0']log[/definition]("User hat eingegeben:" + str(sSearchText)) 
      xbmc.[definition='1','0']log[/definition]("Request lautet: http://127.0.0.1:8080/api/movies/" + str(sSearchText))    
      hier gehts weiter


    Sowas in der Art. Was passiert denn dann?

    Mein Heimkino

    Externer Inhalt www.speedtest.net
    Inhalte von externen Seiten werden ohne Ihre Zustimmung nicht automatisch geladen und angezeigt.
  • Ich hab deinen Code jetzt unter sSearchText = cGui().showKeyBoard('german') kopiert. Leider der gleiche Fehler.
    Ich kann mir den string ja auch ausgeben. Per xmbc.dialog z.B. wird er mir ja auch richtig angezeigt. Kommentiere ich das HTTP Request aus, kommt kein Fehler, und die Tastatur wird auch nicht noch einmal geöffnet. Ich denke, dass in dem moment, wo das request die Variabel aufruft, sie sich quasi aktualisiert.

    Edit: Ich habe jetzt folgenden Code:

    Code
    sSearchText = cGui().showKeyBoard('german')
    if not sSearchText:
       xbmc.[definition='1','0']log[/definition]("Fehler:" + str(sSearchText))
       xbmcgui.Dialog().ok(addonname, "error") 
    else:
      search2 = sSearchText
      xbmcgui.Dialog().ok(addonname, search2) 
      url2 = "http://127.0.0.1:8080/api/movies/" + search2
      r = requests.get(url2)

    Es passiert folgendes:
    1. Die Tastatur öffnet sich, und ich mache meine Eingabe
    2. Eine Dialogbox zeigt mir meine Eingabe
    3. Nach dem bestätigen öffnet sich erneut die Tastatur
    4. Kurz darauf das Dialogfenster, was mir den richtigen link zeigt
    5. Es öffnet sich ein letztes Dialogfenster, mit "error" und Kodi schmeißt den bekannten Fehler

  • Leider sehe ich nicht wo der Fehler herkommen kann. Es muss aber dann wohl tatsächlich etwas mit dem request zu tun haben.

    Wenn Du magst kannst Du mir das komplette script irgendwo hochladen. Auch per PM wenn Du das nicht öffentlich haben möchtest. Dann schaue ich mir das in meiner Testumgebung mal an.

    Mein Heimkino

    Externer Inhalt www.speedtest.net
    Inhalte von externen Seiten werden ohne Ihre Zustimmung nicht automatisch geladen und angezeigt.
  • Ok. Nach etlichen nachinstallieren von modulen, konnte ich das script dann starten.
    Ich nutze zum testen diesen code:
    Ich habe soweit alles dringelassen, um evtl dem Problem auf die Spur zu kommen.


    Nach dem starten des scripts geht ein Fenster auf und das Wort 'german' steht schon da. Zum testen habe ich dann mal etwas anderes eingegeben und zwar blubblub :)
    Danach bekomme ich noch ein testfenster mit blubblub und danach wird der request gemacht. Ohne Probleme, ohne das ein zweites mal das Keyboard aufgeht.
    Hier das [definition='1','0']log[/definition] was natürlich den Fehler wirft im request module weil die url nicht antwortet:


    somit kann ich leider nur sagen das Dein code funktioniert und das Problem woanders zu suchen ist. Evtl in den verwendeten modulen oder verweisen.

    Mein Heimkino

    Externer Inhalt www.speedtest.net
    Inhalte von externen Seiten werden ohne Ihre Zustimmung nicht automatisch geladen und angezeigt.
  • Ein fettes danke für deine Hilfe. Das das problem bei anderen request links nicht auftritt ist mir auch grad aufgefallen.
    Irgendwie merkwürdig. Meine API braucht ein paar sek. zum Antworten, dachte erst, das es daran liegt, aber dann würde requests ja ein Timeout als Fehler raus geben.

    Edit: Ohne scheiss, ich könnte dir die Füße küssen :D
    Ich weiß nicht, was du anders gemacht hast, aber hab meinen code mit deinem überschrieben, und siehe da: Es rennt. :)
    Bin jetzt seit über ne Stunde dabei, den String irgendwie abzukapseln. Hab mir sogar eine extra funktion für die suche gebaut, die die url zurückgibt, aber alles ohne Erfolg.

  • das einzige was ich geändert habe ist die variable addon_handle. Die hatte ich static mit einem int definiert. Wenn du Bock hast kannst Du das ja nochmal wieder reinnehmen und nochmals testen.

    Mein Heimkino

    Externer Inhalt www.speedtest.net
    Inhalte von externen Seiten werden ohne Ihre Zustimmung nicht automatisch geladen und angezeigt.
  • Ich vermute du moechtest ein plugin fuer Addon entfernt - die Moderation entwickeln. Somit wird dein script nicht von kodi direkt (so wie ich es zum testen gemacht hatte, deswegen der static handle) sondern vom Addon entfernt - die Moderation aufgerufen.
    Der Addon entfernt - die Moderation uebergibt deinem script eine handle id. Wenn Du dann die Daten hast zeigt das Addon entfernt - die Moderation diese dann über den handle an. Somit weis das xstream woher alles kommt. vereinfacht ausgedrueckt.

    Das Problem scheint also wenn ich richtig liege mit dem Addon entfernt - die Moderation zusammenzuhaengen. Somit musst Du dich wohl oder uebel mit der Entwicklung von Addon entfernt - die Moderation plugins auseinandersetzten.

    So wie ich es kurz gesehen habe, haben die auch ein Forum. Im Zweifelsfall da nochmals nachfragen.

    Mein Heimkino

    Externer Inhalt www.speedtest.net
    Inhalte von externen Seiten werden ohne Ihre Zustimmung nicht automatisch geladen und angezeigt.

    2 Mal editiert, zuletzt von SkyBird1980 (28. Dezember 2016 um 11:06)

  • @SkyBird1980, da hast du wohl 2 übersehen :thumbup:

    Auch wenns vielleicht so aussieht, ich versuche nicht ein Plugin für dieses Addon zu schreiben. Ich will Nachts ja noch ruhig schlafen ;D
    Ich habe Resourcen von dem Addon verwendet, weil ichs nicht hinbekommen habe eine fehlerfreie Tastureingabe aufzurufen. Die def GUIEditExportName ist ja noch drin, hat aber Fehler produziert. Ich hab dann auf Github gesuscht, wo ich mich bedienen kann.
    Wahrscheinlich hast du schon gemerkt, das ist ein absoluter Python Noob bin. Das Plugin soll eigentlich nur folgendes machen: Tastatur öffnen, api mit der suche im link aufrufen und dann die Ergebnisse als Listitems anzeigen. Klappt ja auch schon, wäre da nicht das Problem mit der Tastatur. Ich versuche mal, die Eingabe anders zu starten.
    Danke dir auf jeden Fall für deine Unterstützung, und der Erklärung mit dem Handle. Hab noch bis 2 Uhr dran rumgespielt ^^.

    Edit: Keine Änderung. Ich habe

    Python
    from resources.lib.gui.gui import cGui
    from resources.lib.gui.guiElement import cGuiElement

    Entfernt, und auch den resources Ordner gelöscht. Die Suche übernimmt jetzt wieder GUIEditExportName
    Mein Addon wird als VideoAddon gestartet, sollte aber keinen Unterschied machen, oder?

  • 1. Videoaddon startet
    2. Die Tastatur öffnet sich
    3. Es wird ein Request gemacht
    4. Eine Liste wird erstellt
    5. Die Tastatur öffnet sich erneut
    6. Ich bekomme die Dialogbox "error" (im if not Zweig)
    Zwischendurch werden immer mal Dialogboxeen geöffnet, die mir zeigen, was gerade im Code vorgeht.

    Hier der aktuelle Code:
    http://pastebin.com/nYJwfdHQ

    Die Flag war mein versuch, das erneute öffnen zu verhindern.

    Danke schon mal :)

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!