Html mit python -> Brauche Ratschlag

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
Mati
User
Beiträge: 68
Registriert: Dienstag 6. Juni 2006, 16:54

Hallo,

ich erstelle mittels Python ein HTMl file was ohne Probleme geht. Nun ist es so dass ich in diesem HTML file z.B checkboxen habe die dann natuerlich angeklickt werden koennen wenn man das html file im browser sich anschaut.

Wenn ich jezt einen Button habe der "run" heisst in diesem html file. Also eigentlich html code ist, kann ich dann z.b. die namen der checkboxen ausgeben lassen?

Also im Grunde will ich nur wissen ob das ueberhaupt machbar ist. Weil ich muss ja dann irgendwie ne routine aufrufen durch den klick aufden Button. Aber das kann ich ja jetzt nicht in html machen oder? Koennte ich aus dem html file ne routine aus meinem Python skript aufrufen?

Danke fuer jede Hilfe
Benutzeravatar
keppla
User
Beiträge: 483
Registriert: Montag 31. Oktober 2005, 00:12

ich erstelle mittels Python ein HTMl file was ohne Probleme geht.
Hieraus vermute ich mal, dass diese Datei dann irgendwo auf deiner festplatte rumliegt, du also keinen webserver laufen hast.
Nun ist es so dass ich in diesem HTML file z.B checkboxen habe die dann natuerlich angeklickt werden koennen wenn man das html file im browser sich anschaut. Wenn ich jezt einen Button habe der "run" heisst in diesem html file. Also eigentlich html code ist, kann ich dann z.b. die namen der checkboxen ausgeben lassen?
Wenn du in HTML ein formular definiert hast, sendet dein browser einen get oder post request (je nach angegebener methode) an die mit action angegebene url.

<form action="www.example.com/login" method="post"> würde also einen post-request an w.e.c/login senden.

Der server an dieser stelle erhält dann alle daten des Formulars, dazu gehören imho auch die namen der checkboxes.
Was der Server dann damit macht, ob er es nun mit python oder (grauen) php bearbeitet, ist seine sache (also: es ist möglich).

Wenn du möchtest, das, vergleichbar zu javascript, der OK-Button eine aktion auf seite des clients auslöst: ich befürchte, das geht nicht.
Mati
User
Beiträge: 68
Registriert: Dienstag 6. Juni 2006, 16:54

Vilen dank fuer deine Hilfe keppla...

also ich weiss nicht ob du mein Problem auch richtig verstanden hast. Ich habe ein HTML file welches nicht auf irgendeinem server liegt, sondern nur ein file welches ich im browser anschauen kann. Und jetzt moechte ich dieses file eben die Aktionen durchfuehren also die href referenzen ausgeebn lassen z.b.

Aber ich glaube du hast das im letzten satz gemeint mit "auf client seite geht das nicht ", oder ??
Mati
User
Beiträge: 68
Registriert: Dienstag 6. Juni 2006, 16:54

Ginge das evtl. mit php zu realisieren??

ich muesste dann halt die php commands einfach als string ins html file schreiben so wie ich auch den html code bastele...
koennte das funktionieren ??
Benutzeravatar
keppla
User
Beiträge: 483
Registriert: Montag 31. Oktober 2005, 00:12

ich war mir auch nicht sicher, aber es scheint so, dass ich es tatsächlich verstanden habe. ("Hieraus vermute ich mal, dass diese Datei dann irgendwo auf deiner festplatte rumliegt").

Ich habe nur etwas weiter ausgeholt, ich schwafele gerne ;)

ne, mal zur sache: eine art "PythonSkript" ist mir unbekannt. Je nach browser mag es da plugins für geben, aber nichts, was a) standardmäßig verfügbar oder b) browserunabhängig wäre.

Darf man fragen, warum du eine lokale HTML-Datei mit funktionen ausstatten willst? Denn möglicherweise versuchst du ja, eine art GUI zu machen, da wäre dann wxPython, pyGTK (meine empfehlung, ich mags) oder pyQt vermutlich die bessere Wahl.
Benutzeravatar
keppla
User
Beiträge: 483
Registriert: Montag 31. Oktober 2005, 00:12

Ginge das evtl. mit php zu realisieren??
Nein, definitiv nicht.
ich muesste dann halt die php commands einfach als string ins html file schreiben so wie ich auch den html code bastele...
koennte das funktionieren ??
Nope. PHP ist (abgesehen von der aktuen Gefährdung der geistigen Gesundheit, der man beim skripten ausgesetzt ist) nichts anderes als was Django, CherryPy und Konsorten für Python oder Rails für ruby wäre.

PHP & Co funktionieren serverseitig, das heisst: du gibst eine URL in deinen Browser ein, und bekommst eine HTML-seite, ganz ohne programmcode zurück. Wenn du ein formular ausfüllst, und auf OK klickst, ist im prinzip das nichts anderes, als würdest du eine (etwas kompliziertere) url in deinen browser eingeben. Der Webserver, der deinen request (das, was der Browser aus der URL macht) bekommt, guckt sich die übermittelten Daten (die ausgefüllten Felder) an, und erzeugt eine html-seite, die er dann an dich und deinen brwoser zurückschickt. Die erzeugte Seite enthält wieder keine Funktionen, nur reines HTML.

Die Einzigen fälle, wo auf dem Client etwas passiert, sind Erweiterungen der Browser (flash, javascript, java-applets, activeX-controls), die haben aber mit HTML eigentlich nicht mehr viel zu tun.
Mati
User
Beiträge: 68
Registriert: Dienstag 6. Juni 2006, 16:54

Vielen lieben Danke keppla,

dank dir verstehe ich jetzt schon mal mehr :)

du meintest wieder in deinem letzten saetzen dass es evtl. mit javascript gehen koennte?
weil das kann ich ja in html code einbinden...

Leider ist es keine GUI die ich baue...es ist ein wirklich spezielles (und damit bescheuertes ) Problem...

Wens interessiert>
Ich haue mit dem python skript eine htmltabelle von einer Zeile raus. Mit dieversen eintraegen.

Andere user wollen dann viele Html zeilen einfach zusammenkopieren in dieses Html file sodass mehrere zeilen entstehen...warum auch immer....
Und jetzt wollten sie eben checkbuttons um eben die Zeilen die angeklickt werden und dann auf einen Ok Button der auch auf dieser Html seite waere nur die Zeilen loeschen sozusagen....

Danke vielmals fuer Hilfe!!!!
Benutzeravatar
keppla
User
Beiträge: 483
Registriert: Montag 31. Oktober 2005, 00:12

mal von der frage abgesehen, warum man sowas mit html machen will: du könntest vielleicht mir einem gui-toolkit einen eigenen minibrowser schreiben. die meisten toolkits haben ein "html-anzeigen"-steuerelement, um den html-render-spass musst du dich also nicht kümmern.

bezüglich javascript: ich bin mir nicht sicher, ob man mittels javascript was auf der platte speichern kann, aber html-manipulationen (tabellenzeilen hinzufügen oder löschen) kann man definitv.
Mati
User
Beiträge: 68
Registriert: Dienstag 6. Juni 2006, 16:54

Danke fuer die Antworten>
eigentlich sollte sowas passieren>
bei klick aufden Button sollen in dem html file alle Zeilen der Tabelle die angeklickt sind nach bild-referenzen durchsucht werden udn diese bilder dann angezeigt werden.
Also wenn ich eine Tabelle in html code vor mir habe und vor jeder Zeile ein checkbutton. Dann waehle ich ein paar aus und druecke auf Show> und aus jeder Zeile die angehackt wurde soll auf einen schlag das bild angezeigt werden. Damit muss ich ja ueber das html file selbst laufen oder? und dann die Bilder sammeln....waere das realisierbar mit javascript??
Benutzeravatar
keppla
User
Beiträge: 483
Registriert: Montag 31. Oktober 2005, 00:12

bei klick aufden Button sollen in dem html file alle Zeilen der Tabelle die angeklickt sind nach bild-referenzen durchsucht werden udn diese bilder dann angezeigt werden.
Was genau meinst du mit "bild-referenzen"? Sowas wie <img src=xxx /> ?
Damit muss ich ja ueber das html file selbst laufen oder? und dann die Bilder sammeln....waere das realisierbar mit javascript??
Wenn es wirklich eine Lokale datei sein muss, dann ja. Ob das mit javascript geht, kann ich nicht 100% beantworten. "Prinzipiell" schon. Praktisch könnte es sein, dass javascript nicht an die lokalen Dateien randarf, aus Sicherheitsgründen, aber da hab ich keine Ahnung.

Allerdings frage ich mich, warum du das ganze unbedingt als HTML-Datei haben möchtest. Du oder dein Kunde dürfte doch als primäres interesse "suchen und anzeigen von bildern" haben, mit den gängigen GUI-Toolkits könntest du im handumdrehen ein vollwertiges Programm bauen, was diesen Job erledigt.
Denn im endeffekt tust du ja gerade nichts anderes: du versuchst ein Programm mit einer GUI zu schreiben, nur nimmst du dazu zZ ein denkbar ungeeignetes Werkzeug (HTML).
Mati
User
Beiträge: 68
Registriert: Dienstag 6. Juni 2006, 16:54

danke keppla,

ich weiss dass das Problem so bescheuert ist...es ist nur so dass die eine bereits bestehende Loesung da ist die eben html verwendet und ich dies zusaetzlich erweitern wollen wuerde

Genau:das mit den referenzen ist eben so wie du beschreibst mit img src....
oder man koennte auch einfach nur nen <a href ... von einem text oder einem Bild ist ja wurscht...

danke euch!
BlackJack

So ganz habe ich immer noch nicht verstanden was Du genau haben willst. Ich hatte den Tag über mal ein kleines Beispiel gebastelt nach der Problemstellung bevor von Bildern die Rede war. Da klang es noch so als wenn die markierten Zeilen aus der Anzeigen verschwinden sollten. Das könnte man rein client-seitig mit JavaScript so erreichen:

Code: Alles auswählen

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" 
          "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html>
  <head>
    <title>Test</title>
    <script type="text/javascript" src="test.js"></script>
  </head>
  <body>
    <form id="fruit_form">
      <table>
        <tr>
          <td><input type="checkbox" /></td>
          <td>Apples</td>
        </tr>
        <tr>
          <td><input type="checkbox" /></td>
          <td>Oranges</td>
        </tr>
        <tr>
          <td><input type="checkbox" /></td>
          <td>Peaches</td>
        </tr>
        <tr>
          <td><input type="checkbox" /></td>
          <td>Bananas</td>
        </tr>
        <caption>Fruits</caption>
      </table>
      <p>
        <input type="button" value="Hide marked" onclick="hideMarked()" />
        <input type="button" value="Show all" onclick="showAll()" />
      </p>
    </form>
  </body>
</html>
Und die dazugehörige JavaScript Datei `test.js`:

Code: Alles auswählen

function traverseCheckboxes(all, displayStyle) {
    var elements = document.forms.fruit_form.elements;
    for (var i = 0; i < elements.length; ++i) {
        var element = elements[i];
        if (element.type == 'checkbox' && (all || element.checked)) {
            // Go from checkbox to row node and set style.
            element.parentNode.parentNode.style.display = displayStyle;
        }
    }
}

function hideMarked() {
    traverseCheckboxes(false, 'none');
}

function showAll() {
    traverseCheckboxes(true, 'table-row');
}
Das gibt Dir vielleicht schon mal eine Idee was mit JavaScript so alles machbar ist.

Könntest Du Dein Problem vielleicht noch ein bischen genauer beschreiben. Wie soll die Seite aussehen? was kann man da markieren? Wo liegen die Bilder? Ein kleines Beispiel vorher/nachher wäre nett.
Mati
User
Beiträge: 68
Registriert: Dienstag 6. Juni 2006, 16:54

Wow!

Danke fuer Dein grosszuegige Hilfe Keppla.
Also ich versuche nochmal genau zu beschreiben wie das Poblem aussieht:

Mit einem Tool (das ist jetzt nicht von belang) wird eine html seite produziert die eine ganz gewoehnliche html seite ist mit einer Tabelle aus einer Zeile. also body....td.../td uws.

Nun ist es so dass die Seite eine Tabelle mit nur einer Zeile ist und diese ist im Moment OHNE Checkbox!
In einer Zelle dieser Zeile ist ein Link auf ein Bild - wenn man den Link anklickt popt das Bild hoch. D.H. das Bild liegt also in einem Ordner (klar :P )

Egal wie umstaendlich das folgende ist: Es muss so sein:
So, jetzt ist es so dass ein user eben mehrere dieser html files mit nur EINER Zeile hat. Er geht her und kopiert nur die Zeile vom HTML file MANUELL in das andere. Somit entsteht also eine Tabelle aus 2 Zeilen. Und dass kann er beliebig oft machen. Es entsteht also eine Tabelle aus vielen Zeilen.

Jetzt wuerde ich gern eben eine Checkbox vor jede Zeile setzen. D.h es wuerde auch durch das kopieren der Zeilen eine Tabelle mit vielen Checkboxen da sein da ich die Checkbox in die Tabellenzeile einfuegen wuerde und damit wurde der user auch die checkbox mitkopieren.
Zeilen koennen damit einfach nur angewaehlt werden.

Jetzt sollte ganz unten (NICHT IN DER TABELLE) ein Button sein (start...) wo ich bei Anklicken aus allen Zeilen der Tabelle die angehackt sind die Bilder (habe ich vorhin beschrieben mit dem Link) einfach z.B erscheinen (pop up) wuerden oder z.b auch nur der Pfad zum Bild ausgegeben wuerde. Ich brauche einfach nur bei start... den Zugriff auf alle Bilder die sich in Zeilen (der evtl. zusammengesetzten Tabelle) befinden die angehackt sind. Diese Bilder muss ich in ein neues Tool speisen d.h ich muss dieses Tool mit den Bildern fuettern (wohl nur mit den Pfaden).

Ich weiss dass es sehr umstaendlich ist und auch sehr unschoen. Aber leider gehts wirklich nur so. Deswegen die Frage obs ueberhaupt moeglich waere...

danke fuer die Hilfe schonmal :P
BlackJack

Wieviel Kontrolle hast Du denn über die Erzeugung der HTML-Dateien mit der einen Zeile?

Wenn Du die selbst erzeugst, oder zumindest verändern kannst bevor sie beim Endnutzer landen, dann könntest Du die Tabelle wie im Beispiel in ein <form> Einbetten, einen Checkbutton in die Zeile einfügen und sowohl dem Checkbutton als auch dem Link eine ID mitgeben. Dann kannst Du per JavaScript wie im Beispiel an die Checkbuttons kommen und über die IDs dann den zugehörigen <a> Tag ermitteln. Also die Buttons bekommen dann z.B. als ID "b_foo" und das dazugehörige Tag "a_foo". Musst natürlich `foo` so wählen, das es eindeutig ist und zum Verweisziel passt.

Dann unter dem Button vielleicht noch ein Textarea wo man dann per JavaScript die Links reinschreiben kann.

Ich weiss, Du hast mehrfach erwähnt dass das so sein *muss*, aber es klingt sehr umständlich.
Benutzeravatar
keppla
User
Beiträge: 483
Registriert: Montag 31. Oktober 2005, 00:12

Danke fuer Dein grosszuegige Hilfe Keppla.
Ich vermute mal, du meintest BlackJack ;)
BlackJack

Nachtrag zu der Idee in meinem letzten Beitrag:

Code: Alles auswählen

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
          "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html>
  <head>
    <title>Test</title>
    <script type="text/javascript" src="test.js"></script>
  </head>
  <body>
    <form id="fruit_form">
      <table>
        <tr>
          <td><input type="checkbox" id="b_apples" /></td>
          <td><a href="apples.png" id="a_apples">Apples</a></td>
        </tr>
        <tr>
          <td><input type="checkbox" id="b_oranges" /></td>
          <td><a href="oranges.png" id="a_oranges">Oranges</a></td>
        </tr>
        <tr>
          <td><input type="checkbox" id="b_peaches" /></td>
          <td><a href="peaches.png" id="a_peaches">Peaches</a></td>
        </tr>
        <tr>
          <td><input type="checkbox" id="b_bananas" /></td>
          <td><a href="bananas.png" id="a_bananas">Bananas</a></td>
        </tr>
        <caption>Fruits</caption>
      </table>
      <p>
        <input type="button" value="Get marked"
               onclick="traverseCheckboxes()" />
      </p>
      <p>
        <textarea id="output" cols="50" rows="10"></textarea>
      </p>
    </form>
  </body>
</html>
Und die `test.js`:

Code: Alles auswählen

function traverseCheckboxes() {
    var formElements = document.forms.fruit_form.elements;
    var result = '';
    for (var i = 0; i < formElements.length; ++i) {
        var element = formElements[i];
        if (element.type == 'checkbox' && element.checked) {
            result += document.getElementById('a_' + element.id.slice(2))
                      + '\n';
        }
    }
    formElements.output.value = result;
}
Ich denke das ist ein guter Ausgangspunkt. Alles weitere über JavaScript und die Objekte die man im Browser damit ansprechen kann gibts hier: http://selfhtml.org/
Mati
User
Beiträge: 68
Registriert: Dienstag 6. Juni 2006, 16:54

Ja ich meinte BlackJack ;)

Danke.
Wieviel Kontrolle ich habe. Also der User macht gar nichts bis daraufdass er einzelne Zeilen dann zusammenkopiert in EIN HTML file wo dann viele Zeilen entstehen. D.H. Ich habe die Absolute Kontrolle ueber die Erstellung der Zeilen.
Das Problem waere nur dass, dass halt damit sich evtl. 2 ID's ueberschneiden koennten oder? Weil ich rufe das Programm z.B 3 mal auf und es entstehen drei verschiedene HTML files mit jeweils einer Zeile (mit Bild, Link, Checkbox UND einem "run" button der eben die routine darstellt etc...)
Jetzt geht der User her und kopiert zwei der Zeilen (aus zwei files eben) heraus und in das dritte rein (natuerlich an die richtige stelle) und damit entsteht eine Tabelle mit 3 Zeilen. In diesem File kann er ja dann auf den run-Button gehen und eben die Links auslesen. Da alle Files einen run button haben der urspruenglich auch miterzeugt wird ist es egal welche 2 Zeilen er in ein drittes file kopiert.

Gaebe es evtl. eine Moeglichkeit ueber den run-button ein zweites Python skript aufrufen zu lassen welches z.B. durch das html file laeuft und mir eben das gewuenschte Problem (Links auslesen der angecheckten Boxen der Zeilen und der BildLinks in dieser Zeile) herausliest???

Ginge so ein Aufruf?

Danke wiedermal und bis zum naechsten mal :D
BlackJack

Mati hat geschrieben:Ja ich meinte BlackJack ;)

Danke.
Wieviel Kontrolle ich habe. Also der User macht gar nichts bis daraufdass er einzelne Zeilen dann zusammenkopiert in EIN HTML file wo dann viele Zeilen entstehen. D.H. Ich habe die Absolute Kontrolle ueber die Erstellung der Zeilen.
Das Problem waere nur dass, dass halt damit sich evtl. 2 ID's ueberschneiden koennten oder?
Darum sind in meinem Beispiel in den IDs die Dateinamen enthalten. Da wäre es auch kein Problem wenn die Zeilen vorher in einzelnen Dateien gestanden hätten.

Du musst also beim erzeugen dafür sorgen, das die IDs eindeutig sind. Falls es egal ist, das zwei Dokumente die sich auf die gleiche Datei beziehen, unterschiedliche IDs haben, dann kannst Du zum Beispiel einfach die aktuelle Zeit plus einer Zufallszahl nehmen. Wenn die Dateinamen immer gültige XML-Namen sind, dann kann man das wie in meinem Beispiel lösen. Oder man wandelt den Dateinamen in eine Hexadezimalzahl um, dann ist es egal ob die Dateinamen gültige XML-Namen sind.

Code: Alles auswählen

In [26]: import binascii

In [27]: 'b_' + binascii.b2a_hex('apples.png')
Out[27]: 'b_6170706c65732e706e67'
Gaebe es evtl. eine Moeglichkeit ueber den run-button ein zweites Python skript aufrufen zu lassen welches z.B. durch das html file laeuft und mir eben das gewuenschte Problem (Links auslesen der angecheckten Boxen der Zeilen und der BildLinks in dieser Zeile) herausliest???
Nicht wirklich. Jedenfalls nicht ohne Server.
Antworten