如何通过Kivy与我的计算机通信?

时间:2016-01-19 22:51:54

标签: python windows kivy pc

我想知道是否可以创建一个可以与我的计算机通信的Kivy应用程序。我想能够点击我的Kivy App中的按钮(安装在我的智能手机中)并触发另一个python脚本的执行。例如,我会点击智能手机中的一个按钮,我的Windows PC中的Python代码会打印出“hello world”。

谢谢你们。我非常感谢你的帮助。任何想法都是受欢迎的。

1 个答案:

答案 0 :(得分:1)

首先,您需要一台服务器,例如Flask。使用pip install flask安装烧瓶。

然后,编写一个简单的服务器。代码将写入客户端发送到messages.log文件的消息。当然,您可以做其他事情,例如关闭您的PC。

server.py文件:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from flask import Flask
from flask import request
import time
app = Flask(__name__)


@app.route('/', methods=['POST'])
def hello_world():
    try:
        message = request.form['message']
        return do_something(message)
    except Exception, e:
        print e
        return 'error'


def do_something(message):
    with open('messages.log', 'a') as f:
        current_time = time.ctime()
        f.write(current_time + ': ' + message + '\n')
    return 'message saved'

if __name__ == '__main__':
    app.run(debug=True, host='0.0.0.0')

运行该文件。服务器的地址为http://localhost:5000

一旦有了工作服务器,就编写一个客户端应用程序。代码将向服务器发送文本消息。

test.kv文件:

#:kivy 1.9.0

MainLayout:
    cols: 1
    spacing: '30dp'
    padding: '50dp', '50dp', '50dp', '50dp'

    Label:
        id: status_label
        size_hint_y: 0.3

    TextInput:
        id: message_input

    Button:
        text: 'send message to server'
        on_press: root.send_message(message_input.text)

    Button:
        text: 'quit app'
        on_press: app.stop()

client.py文件:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from kivy.app import App
from kivy.network.urlrequest import UrlRequest
from kivy.uix.gridlayout import GridLayout
import urllib


class MainLayout(GridLayout):

    count = 1

    def send_message(self, message):
        POST_data = self._prepare_data(message)
        self._send_message(POST_data)

    def _prepare_data(self, message):
        auth_data = {'message': message}
        auth_data = urllib.urlencode(auth_data)
        headers = {
            'Content-type': 'application/x-www-form-urlencoded',
            'Accept': 'application/json'
        }
        return {'auth_data': auth_data, 'headers': headers}

    def _send_message(self, POST_data):
        UrlRequest(
            url='http://localhost:5000/',
            req_body=POST_data['auth_data'],
            req_headers=POST_data['headers'],
            on_failure=self._on_connection_failure,
            on_error=self._on_connection_error,
            on_success=self._on_connection_success,
        )

    def _on_connection_success(self, request, result):
        self.ids.status_label.text =\
            'message %s delivered' % self.count
        self.count += 1

    def _on_connection_failure(self, request, result):
        self.ids.status_label.text = 'connection fail'

    def _on_connection_error(self, request, result):
        self.ids.status_label.text = 'connection error'


class Test(App):
    pass


Test().run()

要使用智能手机连接到服务器,请将UrlRequest中的URL键入计算机的IP地址,而不是“localhost”,例如:http://192.168.0.1:5000/