【问题标题】:Raspberry button trigger Python script which should display in webpageRaspberry 按钮触发 Python 脚本,该脚本应显示在网页中
【发布时间】:2016-05-26 12:05:54
【问题描述】:

我有一个带有按钮的 Raspberry PI。 我在其上运行 Python 脚本来检测按钮何时被按下。 当按下按钮时,它会在文本文件中增加一个数字。 我需要在网页 (Apache) 上显示这个数字并发出声音。

目前,我的 python 脚本将 index.html 更改为我需要的值,我正在使用 <meta http-equiv="refresh" content="1"> 重新刷新页面。

问题是我需要知道数字何时改变才能发出声音。

【问题讨论】:

    标签: javascript python html apache raspberry-pi


    【解决方案1】:

    信息太少,无法说出具体的内容,但鉴于页面不是动态的(无 ajax)的主要以下限制,这就是我将如何解决它。

    总纲:

    将文本文件中的值放在可识别的字段中,例如

    <span id="myNumber">#the number from file goes here </span>

    然后在加载时使用 java 脚本读取字段的值: (平面JS) var myNumberValue = document.getElementById('myNumber').innerHTML; 然后创建一个cookie来存储客户端机器上的最后一个值: document.cookie = "lastNumber="+myNumberValue;

    总结一下:在加载网页时启动一个脚本:

    1. 检查 cookie
    2. 从cookie中读取一个值 (http://www.w3schools.com/js/js_cookies.asp)
    3. 从字段中读取一个值
    4. 如果存在 cookie 比较值,如果数字 改变播放声音如下: Playing audio with Javascript?
    5. 无论哪种方式,都可以将字段中的值存储到 cookie 中以供下一步使用 网站更新。

    [编辑] 使用本地存储或 cookie 的完整工作解决方案:

    <html>
    <head>
    <META HTTP-EQUIV="refresh" CONTENT="5">
    <script type="text/JavaScript">
    function myFunction()
    {
    var numberDisplayed  = parseInt(document.getElementById('myNumber').innerHTML);
    var numberInCookie = numberDisplayed;
    //lets assume that's the only data in the cookie
    var tmpData = readNumber();
    if(tmpData!="NaN" && tmpData!= "undefined") 
        {
            numberInCookie = tmpData;
        }
    if(numberDisplayed!=numberInCookie)
    {
        alert("changed to from "+ numberInCookie+" to " + numberDisplayed);
    }
    saveNumber(numberDisplayed);
    }
    function readNumber()
    {
        if (typeof(Storage) !== "undefined") {
            return localStorage.getItem("lastNumber")
        } else {
            var cookieData = document.cookie;
            //lets assume that's the only data in the cookie
            var tmpData = parseInt(cookieData.split("=")[1]);
            return tmpData
        }
    }
    function saveNumber(number)
    {
        if (typeof(Storage) !== "undefined") {
            localStorage.setItem("lastNumber", number);
        } else {
            document.cookie = "lastNumber="+number;
        }
    }
    </script>
    </head>
    <body  onload="myFunction()">
    <span id="myNumber">2</span>
    </body>
    </html>
    

    [Edit 2] 正如问题的作者所暗示的那样,他实际上并不想使用站点刷新,这是另一个选项: 以免启动一个循环,该循环将从服务器加载测试文件作为 ajax 请求。然后数据被加载,解析,像以前一样在本地存储。并设置定时器再次触发刷新。

    文件需要在同一个域/服务器上可用(有关详细信息,请参阅 HTTP 访问控制 (CORS))

    <html>
    <head>
    <script type="text/JavaScript">
    var externalNumber = 0;
    var timer;
    function myFunction()
    {
    // start the readouts:
    LoadExternalData();
    }
    
    function LoadExternalData()
    {
    var client = new XMLHttpRequest();
    client.open("GET", "http:/myserver/readme.txt");
    client.onreadystatechange = function() {    
      externalNumber = parseInt(responseText);
      //store a local copy
      var NewestNumber = externalNumber;
      var tmpData = readNumber();
      if(tmpData!="NaN" && tmpData!= "undefined") 
            {
                numberInCookie = tmpData;
            }
        if(NewestNumber!=numberInCookie)
        {
            alert("changed to from current  "+ numberInCookie+" to " + NewestNumber);
        }
       saveNumber(NewestNumber);
       timer = setTimeout(LoadExternalData, 1000);
    }
    client.send();
    }
    
    
    function readNumber()
    {
        if (typeof(Storage) !== "undefined") {
            return localStorage.getItem("lastNumber")
        } else {
            var cookieData = document.cookie;
            //lets assume that is the only data in the cookie
            var tmpData = parseInt(cookieData.split("=")[1]);
            return tmpData
        }
    }
    function saveNumber(number)
    {
        if (typeof(Storage) !== "undefined") {
            localStorage.setItem("lastNumber", number);
        } else {
            document.cookie = "lastNumber="+number;
        }
    }
    </script>
    </head>
    <body  onload="myFunction()">
    <span id="myNumber">2</span>
    </body>
    </html>
    

    【讨论】:

    • 它只会加载PageLoad上的数字...数字每秒增加一次
    • 将代码合并到此模板中:&lt;html&gt; &lt;head&gt; &lt;META HTTP-EQUIV="refresh" CONTENT="1"&gt; &lt;script type="text/JavaScript"&gt; function myFunction() { alert('reloaded'); } &lt;/script&gt; &lt;/head&gt; &lt;body onload="myFunction()"&gt; &lt;/body&gt; &lt;/html&gt; 它每秒(每次刷新)启动函数
    • 和我现在做的没什么区别
    • 你在第一篇文章中没有这么说。我已经更新了使用 ajax 加载文件的答案。
    猜你喜欢
    • 2016-12-15
    • 1970-01-01
    • 2021-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-10
    相关资源
    最近更新 更多