You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 13:31:11