3

私は行動科学者であり、通常、参加者にコンピューター上でいくつかのタスクを実行させ、応答を記録させることによってデータを収集します(私はピグレットラッパーPsychoPyを使用してプログラムを作成します)。つまり、プログラムはローカルで実行され、データはローカルに保存されます。

ここで、Pythonを使用してhtmlフォームを含む(ローカル)Webサイトをユーザーに表示し、入力を(ローカルで)収集する方法があるかどうかを知りたいと思います。このアイデアの理由は、現在、チェックボックス、ラジオボタン、または入力フィールドを表示する場合は常にwxPythonを使用しているためです。これは非常にうまく機能しますが、wxPythonでのプログラミングとレイアウトはやや面倒なので、フォーム付きのhtmlを使用したいと思います。

要件は、境界線、アドレスフィールド、メニューバーなどがない状態でラム酒を飲む必要があることです。理由は、一種のフルスクリーンモードで必要なためです(現在、フルスクリーン以外のピグレットウィンドウをサイズで開いています。参加者がフォームで作業する以外に何もできないように、デスクトップを非表示にする画面)。

だから私は(a)メニューバーなどのないピグレットウィンドウの上にhtmlフォームを含むhtmlウェブサイトを表示する方法を探しています、(b)[OK]ボタンをクリックしたときに入力を収集します(つまり、フォームが送信されます)、( c)このWebサイトを表示する前後に表示される内容を制御し、(d)これはすべてローカルで行う必要があります。

次の例の写真で参加者が[送信]ボタンを押して次のページが表示されたときにデータが収集されると思います。

サンプルフォーム

更新: Windows(XPまたは7)を使用しています。

4

5 に答える 5

5

これは、HTMLをレンダリングするためにQtWebkitを使用するソリューションです。デフォルトのナビゲーションリクエストハンドラは、送信されたフォームリクエストをチェックする関数によってラップされます。フォームは「get」メソッドを使用するため、データはリクエストのURLに含まれ、その方法で取得できます。元のリクエストは拒否され、表示されるWebページのコンテンツを自由に変更できます。

from PyQt4 import QtGui, QtWebKit

app = QtGui.QApplication([])
view = QtWebKit.QWebView()

# intercept form submits
class MyWebPage(QtWebKit.QWebPage):
    def acceptNavigationRequest(self, frame, req, nav_type):
        if nav_type == QtWebKit.QWebPage.NavigationTypeFormSubmitted:
            text = "<br/>\n".join(["%s: %s" % pair for pair in req.url().queryItems()])
            view.setHtml(text)
            return False
        else:
            return super(MyWebPage, self).acceptNavigationRequest(frame, req, nav_type)
view.setPage(MyWebPage())

# setup the html form
html = """
<form action="" method="get">
Like it?
<input type="radio" name="like" value="yes"/> Yes
<input type="radio" name="like" value="no" /> No
<br/><input type="text" name="text" value="Hello" />
<input type="submit" name="submit" value="Send"/>
</form>
"""
view.setHtml(html)

# run the application
view.show()
app.exec_()
于 2012-04-19T22:08:33.460 に答える
4

AdamKGが述べたように、Webフレームワークを使用することは良い選択です。Djangoなどはここではやり過ぎかもしれないので、「フラスコ」や「ボトル」のようなマイクロウェブフレームワークを使用するのは素晴らしい選択です。

このリンクは、To-DOアプリケーションを介して簡単なフォームを作成する方法をステップバイステップの説明で示しています。これは、事前の知識がゼロであることを前提としています。

ローカルでも実行できます。

于 2012-04-18T09:04:21.723 に答える
3

シンプルなソリューションが必要なので、httpサーバーを作成してシンプルなページを実行するだけです。

python.BaseHTTPServerを使用して、 15行のWebサーバーをコーディングします。

import BaseHTTPServer

class WebRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):
    def do_GET(self):
        if self.path == '/foo':
            self.send_response(200)
            self.do_something()
        else: 
            self.send_error(404)

    def do_something(self):
        print 'hello world'

server = BaseHTTPServer.HTTPServer(('',80), WebRequestHandler)
server.serve_forever()

簡単ですが、いくつかのWebフレームワークを使用することをお勧めします。彼らも簡単です。

たとえば、web.pyです。これがあなたが50のラインコードで欲しいものです:

  1. web.pyをインストールします
  2. 2つのファイルでdirを作成します。

    ./
    |-- app.py
    `-- templates
        `-- index.html
    
  3. index.html

    $ def with(form、ret)

    <html>
    <head>
                    <title> another site </title>
    </head>
    <body>
            <h1> hello, this is a web.py page </h1>
    
            <form action="" method="post">
                    $:form.render()
            </form>
    
            <h2>$:ret</h2>
    
    </body>
    </html>
    
  4. app.pyロジックファイル:

    import web
    
    ### Url mappings
    
    urls = (
         '/', 'Index', )
    
    ### Templates 
    render = web.template.render('templates')
    
    class Index:
        form = web.form.Form(
            web.form.Textbox('fav_name', web.form.notnull, description="Favorite Name:"),
            web.form.Textbox('cur_name', web.form.notnull, description="Current Name:"),
            web.form.Button('Send Away'),
        )
    
        def GET(self):
            """ Show page """
            form = self.form()
            return render.index(form, "")
    
        def POST(self):
            """ handle button clicked """
            form = self.form()
            if not form.validates():
                return render.index(form, "INPUT ERROR")
    
            # save data by ur method, or do some task
            #pyglet.save_data(form.d.fav_name, form.d.cur_name)
            #pyglet.draw(some_pic)
            #os.system(some_cmd)
    
            form = self.form()
            return render.index(form, "YOUR DATA SAVED")
    
    app = web.application(urls, globals())
    
    if __name__ == '__main__':
        app.run()
    
  5. このサーバーをWindowsで実行します。

    python app.py 9999

  6. ブラウザを開く:http: //127.0.0.1 :9999 /

ちなみに、urデータが文字列のみの場合、sqliteによってweb.byに保存できます。

于 2012-04-20T11:54:57.810 に答える
1

私の提案は次のようになります:

  1. たとえば、Pythonサーバーを使用しますSimpleHTTPServer。フォームの送信ボタンが情報をサーバーに送信するために必要です。そこで、受信した情報を何らかの方法で管理する必要があります。
  2. Alt+F4の使用も許可しないキオスク拡張機能の1つでブラウザを構成します。例として、Firefox用のOpenKiosk拡張機能があります。
  3. オプションで、一般的なスクリプトに精通している場合は、実行時にPythonサーバーを実行し、ブラウザーでhtmlファイルを開くスクリプトを作成できます。それはあなたのグループのすべての主題のためのあなたのセットアップ作業を大いに楽にするでしょう。

編集:ブラウザウィンドウ上にピグレットが必要だと読みました。これは、「常に上に」オプションとピグレットの絶対配置を使用して、ステップ3のスクリプトに含めることができます(これは、永続的なLiveUSBから実行できるLinuxの方がおそらく簡単だと思いますが、考えてみてください)。

編集(投稿されたコメントに関して):出力の最も信頼できるオプションは、代わりにディスク(ファイルまたはデータベース)またはRAM(Pythonオブジェクトを実行)であると思います。その後、ファイルから情報を読み取ります。次に、サプライズ(システムのハング、電源障害)が発生した場合、すでに入力されているデータがそこにあります。

私がどのようにすべきかわからない唯一の(そして最も重要な)部分は、サーバー側でフォームの「送信」のコンテンツを処理することです。おそらく、サーバー側のスクリプトファイル(php、python)を作成してサーバールートに残す必要があるため、サーバーは情報を含むhttpリクエストを受信し、その情報をスクリプトに送信します。スクリプトは処理とファイルを処理します。データベースストレージアクティビティ。

これは興味深いかもしれません:「POSTリクエストメソッドは、ファイルのアップロードや完成したフォームの送信など、クライアントがリクエストの一部としてサーバーにデータを送信する必要がある場合に使用されます。」(「POST(HTTP)」エントリに関するウィキペディアから)

別のリンクでは、SimpleHTTPServerPOSTリクエストを処理するためにそれ自体を使用することについてのいくつかの考え:http: //islascruz.org/html/index.php/blog/show/Python%3A-Simple-HTTP-Server-on-python..html

お役に立てれば。

于 2012-04-14T15:10:07.337 に答える
1

このアイデアの理由は、現在、チェックボックス、ラジオボタン、または入力フィールドを表示する場合は常にwxPythonを使用しているためです。これは非常にうまく機能しますが、wxPythonでのプログラミングとレイアウトはやや面倒なので、フォーム付きのhtmlを使用したいと思います。

HTMLの使いやすさを組み合わせながら、PythonバックエンドでFlexを使用してネイティブWindowsアプリケーションを作成できます。

Flexを嫌う場合は、もう少し複雑ですが、ネイティブのWindowsアプリケーションジェネレーターはCamelotです。

編集

もう一度入力する代わりに、Adobeのdjango + flex+pyamfの記事ですべてをスクリーンショットで説明することをお勧めします。djangoは軽量であるため、フラスコまたはボトルに置き換えることができますが、PyAMFライブラリはdjangoをネイティブでサポートしているため、この例で使用されています。

PyAMFは、Pythonのアクションメッセージ形式(フラッシュランタイムとオブジェクトを交換するためのバイナリプロトコル)のサポートを提供します。

于 2012-04-19T07:10:30.110 に答える