chaquopy 和 android:交互式对话框

问题描述 投票:0回答:1

我尝试实现此功能已经有一段时间了,但我所有的方法都失败了。

我想要一些Python代码在Android应用程序中打开一个对话框,并等待用户单击“确定”按钮(这是我想在创建更复杂的“是/否”对话框之前完成的第一步)。

到目前为止,我能够获得的唯一行为是非阻塞对话框,无论我尝试什么(信号、套接字、共享变量),但似乎直到 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 回调,我也会得到相同的行为。

python java chaquopy
1个回答
0
投票

Android 上的所有内容都在 UI 线程上运行,除非您显式创建另一个线程。因此,您可能也在 UI 线程上调用

open_dialog
,在这种情况下,
while
循环将永远阻塞,并且由
show_dialog
在同一线程上排队的
runOnUiThread
调用永远不会有机会运行。

尝试在后台线程上调用

open_dialog
。您可以通过 Java 或 Python 创建它。在这种情况下,显然就不需要
dialog_thread

您可能还想尝试 BeeWare,这是一个更高级别的 Python 应用程序工具包,可在 Chaquopy 的帮助下在 Android 上运行,并且还可在所有其他主要桌面和移动平台上运行。以下是 tutorialdialog API 的链接,它允许您使用 Python

async
语法获取对话框的结果。

© www.soinside.com 2019 - 2024. All rights reserved.