执行python函数并从html读取变量

时间:2014-06-05 03:54:19

标签: python html

首先,我对编程很新,我对python有一个比较基本的了解,并且对html有一般的了解。

使用我在python中所知道的,我正在尝试创建一个基本的策略游戏,有点像帝国时代或命令与征服,基于收集资源并使用它来构建东西,除了使用简单文本或按钮单击类型界面。我可以做一个文本界面很好,但它有点无聊,我想使用一些图像。我在tkinter上进行了一个小时的讲座,但是我已经尝试过并且未能从中做任何远程“可用”的事情。我能做的就是制作体面的html页面,这样可以很好地满足我的目的。

我想知道的是,是否有一种简单的方法来执行python函数并通过html页面调用/显示python变量? python函数执行所有逻辑和当前变量,它们代表当前资源级别,生产,存储能力,建筑物等级。在最基本的级别,我只需要一种显示这些变量的方法,并具有执行功能的按钮比如说,升级一个建筑物,重新计算生产和所有这些,并返回一组新的值。

作为一个非常简单的例子:

<p> Wheat production: *python integer representing production*</p>
<button type="button" onclick="*execute python variable*">Upgrade Wheat</button>

我想,还需要以某种方式更新html页面上更改的变量。因此按钮执行升级小麦生产的功能,python现在有一个小麦生产变量的新值,这需要在页面上更新,无论是自动还是其他方法。我想简单的方法就是按下按钮也可以重新加载页面,但这看起来有点笨拙。

有谁知道这样做的简单方法?或者也许是一个可以帮助我的python库?

2 个答案:

答案 0 :(得分:2)

是的,有办法做到这一点。

这有两种方法。一种是在服务器上完成所有工作,另一种方法是使用Javascript。

第一种方法是:编写一个生成HTML的python脚本。如果你使用Django,你会得到很多工作,但你也会得到许多你不想要的东西。 Django确实有内置的模板语言。 Django超出了这个答案的范围。你将完全按照上面描述的那样做;模板的示例可能是<p> Wheat production: {{wheat_production}}</p> - 您的python代码将设置一个字典mydict={"wheat_production":10},您将模板文件的名称和字典传递给将吐出页面的函数。如果还没有这样做,您还必须了解HTML表单。

另一种方法是使用Ajax - Javascript,当您的页面显示时(或许,当点击按钮时,或定期)时,将发送/接收一些数据以允许您更新页面。我建议调查JQuery为你做一些提升。这意味着您可以更新页面的位而无需重新加载整个页面。您仍然需要在服务器上编写一些代码来与数据库通信,并将输出(通常是JSON)发送回客户端。

编写此类内容时,请确保所有安全性都在服务器端,并且不要信任用户告诉您的任何内容。例如,如果您将金币的数量存储在表单上的字段中,那么将花费大约10秒的时间为自己提供尽可能多的黄金。同样,如果一个玩家可以出售20颗金币的钻石,那么在给它们金币之前确保他们有钻石 - 你不想最终得到一个拥有1,000,000金币和负一千颗钻石的玩家。 Javascript是100%不安全的,Javascript可以做的任何事情,玩家也可以这样做。

答案 1 :(得分:2)

查看http://pyjs.org/

  

什么是pyjs?

     

pyjs是一个富Internet应用程序(RIA)开发平台   Web和桌面。使用pyjs,您可以编写基于JavaScript的程序   Web应用程序完全使用Python。

     

pyjs包含一个Python-to-JavaScript编译器,一个AJAX框架和一个   Widget Set API。 pyjs起源于Google Web的Python端口   Toolkit,Java-to-JavaScript编译器。

您可以将Python程序编译为javascript,也可以使用他们的Python库来生成HTML。以下是getting started指南中的一个示例:

from pyjamas import Window
from pyjamas.ui import RootPanel, Button

def greet(sender):
    Window.alert("Hello, AJAX!")

class Hello:
    def onModuleLoad(self):
        b = Button("Click me", greet)
        RootPanel().add(b)