安卓Python脚本:GUI?

10 投票
3 回答
24765 浏览
提问于 2025-04-17 02:02

SL4A里有没有基本的图形界面功能?我想在安卓上运行一个Python程序,需要一个列表框和一些简单的对话框(用来显示信息和获取输入)。

看起来有一些简单的对话框,但我还没找到列表框。如果没有列表框的话,我应该能自己做一个,只要能在屏幕的指定位置写文字和高亮矩形,并且能对用户触摸屏幕或输入的操作做出反应(包括知道用户触摸了哪里或者光标在哪里)。

3 个回答

3

一个快速而强大的选择是使用 REBOL 3。你可以使用 SL4a 的功能,但其实不需要:

http://business-programming.com/business_programming.html#section-18

这里有10个完全可以运行的示例程序,带有图形界面。这些程序可以在安卓和桌面操作系统上运行,使用的是完全相同的代码,没有任何修改。脚本非常小,而且创建起来超级简单。没有其他东西能和它相比:

REBOL []
load-gui
view [text "Hello World!"]


REBOL [title: "Tiny Note Editor"]
do %r3-gui.r3  ; download this file manually or just use load-gui as above
view [
    a1: area
    button "Save" on-action [write %notes.txt get-face a1]
    button "Load" on-action [set-face a1 to-string read %notes.txt]
]


REBOL [title: "Data Entry to CSV File"]
do %r3-gui.r3
view [
    text "First Name:"
    f1: field
    text "Last Name:"
    f2: field
    button "Submit" on-action [
        write/append %cntcts.txt rejoin [
            mold get-face f1 " " mold get-face f2 newline
        ]
        request "" "Saved"
    ]
    a1: area
    button "Load" on-action [set-face a1 to-string read %cntcts.txt]
]


REBOL [title: "Text File Reader (How to use a text list file selector)"]
do %r3-gui.r3
view [
    a1: area
    button "Load" on-action [
        files: read %./
        view/modal [
            text "File Name:"
            t2: text-list files on-action [
                set-face a1 to-string read(to-file pick files get-face t2)
                unview
            ]
        ]
    ]
]


REBOL [title: "List-View (Grid) Example"]
do %r3-gui.r3
view [
    text-table ["1" 200 "2" 100 "3"][
        ["asdf" "a" "4"]
        ["sdfg" "b" "3"]
        ["dfgh" "c" "2"]
        ["fghj" "d" "1"]
    ] 
]


REBOL [title: "Calculator"]
do %r3-gui.r3
stylize [
    btn: button [
        facets: [init-size: 50x50]
        actors: [on-action:[set-face f join get-face f get-face face]]
    ]
]
view [
    hgroup [
        f: field return
        btn "1"  btn "2"  btn "3"  btn " + "  return
        btn "4"  btn "5"  btn "6"  btn " - "  return
        btn "7"  btn "8"  btn "9"  btn " * "  return
        btn "0"  btn "."  btn " / "   btn "=" on-action [
            attempt [set-face f form do get-face f]
        ]
    ]
]


REBOL [title: "Sliding Tile Puzzle"]
do %r3-gui.r3
stylize [
    p: button [
        facets: [init-size: 60x60  max-size: 60x60]
        actors: [
            on-action: [
                t: face/gob/offset
                face/gob/offset: x/gob/offset
                x/gob/offset: t
            ]
        ]
    ]
]
view/options [
    hgroup [ 
        p "8"   p "7"   p "6"   return
        p "5"   p "4"   p "3"   return
        p "2"   p "1"   x: box 60x60 white
    ]
] [bg-color: white]


REBOL [title: "Math Test"]
do %r3-gui.r3
random/seed now
x: does [rejoin [random 10 " + " random 20]]
view [
    f1: field (x)
    text "Answer:"
    f2: field on-action [
        either (get-face f2) = (form do get-face f1) [
            request "Yes!" "Yes!"][request "No!" "No!"
        ]
        set-face f1 x
        set-face f2 ""
        focus f2
    ]
]


REBOL [title: "Minimal Cash Register"]
do %r3-gui.r3
stylize [fld: field [init-size: 80]]   
view [
    hgroup [
        text "Cashier:"   cashier: fld 
        text "Item:"      item: fld 
        text "Price:"     price: fld on-action [
            if error? try [to-money get-face price] [
                request "Error" "Price error" 
                return none
            ]
            set-face a rejoin [
                get-face a mold get-face item tab get-face price newline
            ]
            set-face item copy "" set-face price copy ""
            sum: 0
            foreach [item price] load get-face a [
                sum: sum + to-money price
            ]
            set-face subtotal form sum
            set-face tax form sum * .06
            set-face total form sum * 1.06 
            focus item
        ]
        return
        a: area 600x300
        return
        text "Subtotal:"   subtotal: fld 
        text "Tax:"        tax: fld 
        text "Total:"      total: fld
        button "Save" on-action [
            items: replace/all (mold load get-face a) newline " "
            write/append %sales.txt rejoin [
                items newline get-face cashier newline now/date newline
            ]
            set-face item copy "" set-face price copy "" 
            set-face a copy ""    set-face subtotal copy ""
            set-face tax copy "" set-face total copy ""
        ]
    ]
]


REBOL [title: "Requestors"]
do %r3-gui.r3
x: request/ask "Question" "Do you like this?."
either x = false [print "No!"] [print "Yes!"]
x: request/custom "" "Do you like this?" ["Yay" "Boo"]
either x = false [print "Boo!"] [print "Yay!"]
view [button "Click me" on-action[request "Ok" "You clicked the button."]]

如果你想在 REBOL 中使用或添加 SL4a 的功能,只需按照这个链接中的代码操作:https://raw.github.com/gchiu/Rebol3/master/protocols/prot-sl4a.r3

10

如果你想在Android、iOS、Linux、Windows或Mac上做一个Python的图形用户界面(GUI),可以试试kivy... 这个工具很好用!kivy.org

11

基本上,你可以做三件事:

  1. 如果你只是想要简单的安卓列表和输入框,比如获取用户输入(例如用户名和密码)或者显示一个选项列表让用户选择,那么这里有一些教程可以参考: http://code.google.com/p/android-scripting/wiki/UiExamples

  2. 如果你想展示信息(也就是说,不需要用户选择),你可以尝试在WebView中显示HTML,并通过事件来响应: http://code.google.com/p/android-scripting/wiki/UsingWebView

    这样做的话,你可以通过在JavaScript中使用 droid.eventPost(eventName,eventData); 和在Python中使用 droid.eventWaitFor(eventName).result 来获得有限的功能。然后你可以对接收到的数据进行任何你想做的操作。

  3. 如果你觉得勇敢的话,最新的非官方版本支持完整的安卓布局(就是用XML制作的布局,和原生安卓应用中的布局一样)。你可以在这里找到相关指南: http://code.google.com/p/android-scripting/wiki/FullScreenUI

撰写回答