ChaquoPy与Android交互:实现阻塞式确认对话框问题求助
问题:在Android中通过Python实现阻塞式对话框
我尝试实现这个功能已经有一段时间了,但所有方法都失败了。我希望通过Python代码在Android应用中打开一个对话框,并等待用户点击OK按钮(这是我创建更复杂的YES/NO对话框前的第一步)。
目前无论我尝试何种方式(信号、套接字、共享变量),都只能得到非阻塞式对话框,且对话框似乎要等到Python代码执行完毕才会显示。
示例代码
Python代码
from java import dynamic_proxy, jboolean, jvoid, Override, static_proxy from java.lang import Runnable from com.chaquo.python import Python from android.app import AlertDialog from android.content import DialogInterface import threading state_done = False def open_dialog(activity): def show_dialog(): print('Dialog shown') builder = AlertDialog.Builder(activity) builder.setTitle("Title") builder.setMessage("This is a simple dialog from Python!") class Listener(dynamic_proxy(DialogInterface.OnClickListener)): def onClick(self, dialog, which): print("OK button pressed") state_done = True listener = Listener() builder.setPositiveButton("OK", listener) dialog = builder.create() dialog.show() print('Dialog shown') class R(dynamic_proxy(Runnable)): def run(self): show_dialog() def dummy(): activity.runOnUiThread(R()) dialog_thread = threading.Thread(target=dummy) dialog_thread.start() dialog_thread.join() while not state_done: pass print('done')
Java代码
if (!Python.isStarted()) { Python.start(new AndroidPlatform(this)); } Python py = Python.getInstance(); PyObject pyObject = py.getModule("your_script"); pyObject.callAttr("open_dialog", this);
注意事项
使用此代码时,没有任何打印信息执行,仿佛show_dialog从未被调用,对话框也无法显示。若移除while循环,打印信息的执行顺序如下:
I/python.stdout: done I/python.stdout: show_dialog I/python.stdout: Dialog shown *here i press the ok button* I/python.stdout: OK button pressed I/python.stdout: dismissed
是否有直接通过Python创建阻塞式对话框的方法?间接解决方案也可,但即使使用Java回调也会出现相同问题。
@mhsmith提供的解决方案
if (!Python.isStarted()) { Python.start(new AndroidPlatform(this)); } MainActivity activity = this; Runnable runnable = new Runnable() { @Override public void run() { // 在此处编写你的代码 Python py = Python.getInstance(); PyObject pyObject = py.getModule("your_script"); pyObject.callAttr("open_dialog", activity); } }; Thread thread = new Thread(runnable); thread.start();
内容的提问来源于stack exchange,提问作者Luca
相关产品推荐
相关产品推荐

