我想知道是否可以创建一个可以与我的计算机通信的Kivy应用程序。我想能够点击我的Kivy App中的按钮(安装在我的智能手机中)并触发另一个python脚本的执行。例如,我会点击智能手机中的一个按钮,我的Windows PC中的Python代码会打印出“hello world”。
谢谢你们。我非常感谢你的帮助。任何想法都是受欢迎的。
答案 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/
。