Как отобразить веб-сайт с html-формами локально, используя python, и собрать пользовательский ввод?

Я специалист по поведенческому поведению и обычно собираю данные, позволяя участникам выполнять некоторые задачи на компьютере и записывать их ответы (я пишу программы с использованием оболочки Pyglet)PsychoPy). То есть программа запускается локально, а данные хранятся локально.

Теперь я хотел бы знать, есть ли способ использовать Python для отображения (локального) веб-сайта с html-формами для пользователя и сбора входных данных (локально). Причиной этой идеи является то, что в настоящее время, когда я хочу отобразить флажки, радиокнопки или поля ввода, я использую wxPython. Это работает довольно хорошо, но программирование и верстка в wxPython довольно громоздки, и я бы предпочел html с формами.

Требованием было бы то, что ему нужно будет без границ, поля адреса, строки меню ... Причина в том, что он мне нужен в полноэкранном режиме (в настоящее время я открываю не полноэкранное окно пигфлета размером с экран, чтобы скрыть рабочий стол), чтобы участники ничего не могли делать, кроме работы с формами.

So I am looking for a way to (a) display html websites including html form above a pyglet window with no menu bar or whatsoever, (b) collect the input when clicking on the Ok button (i.e., the form is send), (c) control what is presented prior and after viewing this website, and (d) everything of this should happen locally!

Моя идея заключается в том, что данные собираются, когда участники нажимают кнопку «Отправить прочь». Кнопка в следующем примере рис. и отображается следующая страница.

example form

Update: Я использую Windows (XP или 7).

 pwuertz19 апр. 2012 г., 23:04
Разрешено ли использование PyQt4?
 Henrik12 апр. 2012 г., 13:05
Хм, более контролируемый подход будет предпочтительнее.
 AdamKG12 апр. 2012 г., 12:48
Вы можете запустить веб-приложение локально и указать браузеру localhost: portnum и запустить браузер в полноэкранном режиме. Это не помешает им нажать Alt + F4, хотя ...
 Evan Plaice21 апр. 2012 г., 01:01
Движок Google App позволит вам сделать это, но в SDK работает полнофункциональный веб-сервер, поэтому я не уверен, что это именно то, что вы ищете. После сопоставления маршрутов контроллеры определяются путем создания классов Handler с помощью методов get () и post ().
 Henrik19 апр. 2012 г., 23:21
@ user1313312 Если вы используете QT для отображения html, это нормально (и если он работает выше pyglet). Сам QT в принципе тоже был бы в порядке, но он выходит за рамки этого вопроса, который конкретно требует html.

Ответы на вопрос(5)

использование веб-фреймворка было бы хорошим выбором. Поскольку Django и подобные ему могут быть излишними, использование микро-веб-фреймворка, подобного & apos;колба& APOS; илибутылка& APOS; будет отличным выбором.

этоссылка на сайт пошаговая инструкция демонстрирует, как сделать простую форму с помощью приложения To-DO. Это предполагает нулевые предыдущие знания.

Вы можете запустить его только локально.

 Henrik18 апр. 2012 г., 15:37
Я немного просмотрел сайт, и он выглядит многообещающе. Можете ли вы привести пример того, как получить ввод элементов html-формы черезPOST?
 19 апр. 2012 г., 08:34
Конечно, проверьте эту ссылкуbottlepy.org/docs/dev/tutorial.html#request-routing и, в частности, «Методы HTTP-запроса»; [Прямо под упомянутым хешем], у него есть Форма входа, созданная с помощью HTTP-запросов get / post. Это должно быть именно то, что вам нужно.

checkboxes, radiobuttons, or input fields I use wxPython. This works quite well, but programming and layouting in wxPython is kind of cumbersome and I would prefer html with forms.

Вы можете комбинировать простоту HTML и по-прежнему создавать собственные приложения Windows, используясгибать с бэкэндом Python.

Если вы не любите Flex, то немного больше - вовлечены - но все же генератор родных приложений для WindowsCamelot

Edit

Вместо того, чтобы печатать снова - я бы предложилdjango + flex + pyamf статья о Adobe, которая объясняет все это также скриншотами. Вы можете заменить django на колбу или бутылку, так как они более легкие, однако библиотека PyAMF обеспечивает встроенную поддержку django, поэтому она использовалась в этом примере.

PyAMF provides Формат сообщения действия (двоичный протокол для обмена объектами с флэш-средой выполнения) поддержка Python.

 Henrik19 апр. 2012 г., 11:36
Это также звучит очень многообещающе. Есть ли у вас более конкретный указатель о том, как реализовать то, что мне интересно (например, какой-нибудь пример)? Это было бы потрясающе (прогуглить во флексе немного излишне)

поэтому просто напишите http-сервер и запустите свою простую страницу.

с помощьюpython.BaseHTTPServerкодирующий15 line веб сервер:

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.py, вот что ты хочешь в50 line codes:

install web.py

make a dir with 2 files:

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

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>

app.py logic file:

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()

run this server in your windows:

python app.py 9999

open browser: http://127.0.0.1:9999/

Кстати, если ваши данные только строки, вы можете сохранить их в web.by с помощью sqlite.

Решение Вопроса

использующее Qt Webkit для рендеринга HTML. Обработчик запроса навигации по умолчанию оборачивается функцией, которая проверяет отправленные запросы формы. Форма использует & quot; get & quot; метод, поэтому данные включены в URL-адрес запроса и могут быть получены таким образом. Исходный запрос отклонен, и вы можете изменить содержимое отображаемой веб-страницы по своему усмотрению.

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_()
 21 апр. 2012 г., 15:15
Webkit - это полнофункциональный браузерный движок, вы можете свободно использовать Javascript и CSS. Даже частично прозрачные окна без полей не должны быть проблемой для Qt.
 21 апр. 2012 г., 02:40
Вы можете избавиться от этой границы с помощью некоторых CSS. Qt4 поддерживает таблицы стилей CSS.doc.trolltech.com/4.2/stylesheet.html

Use some python server as, for example SimpleHTTPServer. It is needed because the submit button on forms sends the information to a server. There you should manage the received info some way; Have your browser configured with one of those Kiosk extensions, which disallow even the use of Alt+F4. An example would be Open Kiosk extension for Firefox Optionally, if you have affinity with scripts in general, you could create a script which, when executed, would at the same time run the python server AND open your html file in the browser. That, would ease a lot your setup work for every subject in your group.

РЕДАКТИРОВАТЬ: Я прочитал, что вам нужно Pyglet над окном браузера. Это может быть включено в сценарий шага 3, используя «всегда сверху» опция и абсолютное позиционирование pyglet (я могу сказать, что это, вероятно, будет проще в Linux, который может быть запущен из постоянного LiveUSB - просто мысль!)

РЕДАКТИРОВАТЬ (относительно оставленного комментария): Я думаю, что наиболее надежным вариантом вывода будет диск (файл или база данных) или ОЗУ (запущенный объект python), после чего вы будете читать информацию из файла впоследствии. Затем, в случае неожиданности (зависание системы, сбой питания), уже введенные данные будут там.

Единственная (и самая важная) часть, которую я не знаю, КАК делать, - это обрабатывать содержимое формы «отправить». на стороне сервера. Возможно, какой-то файл сценария на стороне сервера (php, python) должен быть создан и оставлен в корне сервера, поэтому сервер получит запрос http, содержащий информацию, и отправит информацию в сценарий, который затем обрабатывает обработку и файл / деятельность по хранению базы данных.

Это может представлять ваш интерес: & quot; Метод запроса POST используется, когда клиенту необходимо отправить данные на сервер как часть запроса, например, при загрузке файла или отправке заполненной формы. & quot; (из википедии на «POST (HTTP)» ENTRY)

В другой ссылке некоторые мысли по использованиюSimpleHTTPServer Сам для обработки POST-запросов: http://islascruz.org/html/index.php/blog/show/Python%3A-Simple-HTTP-Server-on-python..html

Надеюсь это поможет.

 Henrik14 апр. 2012 г., 19:06
На самом деле я хочу окно Пиглетbelow окно браузера, но это не совсем необходимо, если браузер работает в полноэкранном режиме. Однако мне нужно, чтобы все (т. Е. Открытие сервера, открытие html-файла, сбор ввода, возвращение управления основному скрипту python) выполнялось автоматически. Итак, не могли бы вы рассказать подробнее о том, как вы поместите это в сценарий? И можно ли это сделать только на Python? И я бы очень хотел, чтобы данные были в доступном объекте Python после закрытия браузера.

Ваш ответ на вопрос