Я использую Python CGI для создания веб-страницы с заголовком, выпадающим меню и изображением. Я хотел бы иметь возможность выбрать вариант из раскрывающегося меню (хотелось бы также избавиться от «отправить» и просто запустить, когда выбран вариант), запустить мой код Python (runthis.py) и обновить изображение на веб-страница. Я хочу сделать это БЕЗ открытия новых вкладок и, надеюсь, без обновления страницы. В настоящее время я запускаю этот файл .py, чтобы получить свой html:
#!C:\Python27\python
print "Content-type: text/html"
print
print "<html>"
print "<head>"
print "<title>Tab Title</title>"
print "</head>"
print '''<body bgcolor="#ccffcc">'''
print '''<h1 align="center">Page Heading</h1>'''
print '''<form action="/cgi-bin/dropdown.py" method="post" target="_blank">'''
print '''<select name="dropdown">'''
print '''<option value="Option1" selected>Option1</option>'''
print '''<option value="Option2" selected>Option2</option>'''
print "</select>"
print '''<input type="submit" value="Submit"/>'''
print "</form>"
print "<img src = /test.png>"
print "</body>"
print "</html>"
Когда я нажимаю «отправить», открывается новая вкладка, показывающая тот же макет страницы, только другое изображение (то же самое, например). Делается это через мой файл dropdown.py
в cgi-bin:
#!C:\Python27\python
import cgi,cgitb,os
cgitb.enable()
os.environ['HOME']='C:\python_cgi'
import matplotlib
matplotlib.use('Agg')
form = cgi.FieldStorage()
if form.getvalue('dropdown'):
subject = form.getvalue('dropdown')
else:
subject = "Not Entered"
from matplotlib.figure import Figure
from matplotlib.backends.backend_agg import FigureCanvasAgg
import StringIO
import msvcrt,sys, urllib, base64
fig = Figure(figsize=[4,4])
ax = fig.add_axes([.1,.1,.8,.8])
ax.scatter([1,2],[3,4])
canvas = FigureCanvasAgg(fig)
imgdata = StringIO.StringIO()
fig.savefig(imgdata, format='png')
imgdata.seek(0)
uri = 'data:image/png;base64,' + urllib.quote(base64.b64encode(imgdata.buf))
print "Content-Type: text/html"
print
print """\
<html>
<head>
<title>Tab Title</title>
</head>
<body>
<body bgcolor="#ccffcc">
<h1 align="center">Page Heading</h1>
<form action="/cgi-bin/dropdown.py" method="post" target="_blank">
<select name="dropdown">
<option value="Option1" selected>Option1</option>
<option value="Option2" selected>Option2</option>
</select>
<input type="submit" value="Submit"/>
</form>
<img src = %s/>
</body>
</html> """ % uri
Резюмируя: я просто хочу изменить изображение/изображение на текущей странице, а не открывать совершенно новую страницу. Моя интуиция подсказывает мне использовать javascript (о котором я ничего не знаю). Есть ли у кого-нибудь предложение по блоку кода, который мне нужно ввести, чтобы сделать такую вещь?
Спасибо!
ИЗМЕНИТЬ
В комментариях ниже я пытаюсь реализовать этот html-файл:
<html>
<head>
<title>Tab Title</title>
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js" ></script>
</head>
<body>
<script>
function changeImage(imgName)
{
jQuery.get('/cgi-bin/dropdown.py', function(data) {
image = document.getElementById('imgDisp');
image.src = data;
})
}
</script>
<body bgcolor="#ccffcc">
<h1 align="center">Page Heading</h1>
<select name="dropdown" onchange="changeImage(this.value)">
<option value="Option1">Option1</option>
<option value="Option2">Option2</option>
</select>
<img id="imgDisp" src="/test.png" />
</body>
</html>
Это правильно загружает мою страницу, но ничего не происходит, когда я делаю выбор из раскрывающегося списка. Я надеялся, что образ изменится. Мой код "dropdown.py" теперь выглядит так:
#!C:\Python27\python
import cgi,cgitb,os
cgitb.enable()
os.environ['HOME']='C:\python_cgi'
import matplotlib
matplotlib.use('Agg')
from matplotlib.figure import Figure
from matplotlib.backends.backend_agg import FigureCanvasAgg
import StringIO
import msvcrt,sys, urllib, base64
fig = Figure(figsize=[4,4])
ax = fig.add_axes([.1,.1,.8,.8])
ax.scatter([1,2],[3,4])
canvas = FigureCanvasAgg(fig)
imgdata = StringIO.StringIO()
fig.savefig(imgdata, format='png')
imgdata.seek(0)
uri = 'data:image/png;base64,' + urllib.quote(base64.b64encode(imgdata.buf))
return uri
Я еще не дошел до подхода к параметру URL - не уверен, как это делается. Любые дополнительные советы будут очень признательны!
img
в DOM. - person Michael Zalla   schedule 11.02.2014/cgi-bin/myscript.py?option=1
) для вашего сценария и получить доступ к значениям параметров в сценарии CGI с помощью класса FieldStorage (см. python.org/2/library/cgi.html#id1" rel="nofollow noreferrer">docs.python.org/2/library/cgi.html#id1). Ценность этого дизайна заключается в простоте интерфейса. - person Michael Zalla   schedule 11.02.2014src
элемента изображения этот URL. - person Michael Zalla   schedule 11.02.2014