ฉันจะพัฒนาแอปพลิเคชัน Ubuntu ใน HTML และ JS ได้อย่างไร


34

ฉันกำลังพัฒนาแอพและฉันคิดว่า HTML และ JavaScript ดีกว่าสำหรับอนาคต แต่ฉันไม่พบบทเรียนใด ๆ (ฉันต้องการแอพเพื่อใช้ธีมของระบบ)

มีการรวมสำหรับ Unity เมนูข้อความและการแจ้งเตือน couchdb และอื่น ๆ หรือไม่?


คุณอาจพบคำถามที่คล้ายกันนี้ที่น่าสนใจ: askubuntu.com/questions/97430/…
David Planella

คำตอบ:


24

ดีจุดผูกและ API บน Ubuntu เริ่มต้นสามารถพบได้บนdeveloper.ubuntu.com ฉันไม่เคยมีประสบการณ์มาก่อน แต่คุณอาจต้องการดูGjs การเชื่อม Javascript กับ GNOME

ขึ้นอยู่กับสิ่งที่คุณพยายามจะทำคุณสามารถสร้างแอปเช่นแอป HTML + JS แล้วโยนลงในมุมมอง Webkit มันง่ายมากที่จะทำในหลาม:

#!/usr/bin/env python

from gi.repository import Gtk, WebKit
import os, sys

class Browser:
    def __init__(self):
        self.window = Gtk.Window()
        self.window.set_default_size(800, 600)
        view = WebKit.WebView()
        view.load_html_string("<strong>Hello World!</strong>", "file:///")  
        self.window.add(view)

        self.window.show_all()
        self.window.connect('destroy', lambda w: Gtk.main_quit())

def main():
    app = Browser()
    Gtk.main()

if __name__ == "__main__":
    main()

7
JS เป็นโปรแกรมจริงด้วย
Owais Lone

17

คุณสามารถพัฒนาโดยใช้ HTML + Javascript สำหรับอินเทอร์เฟซโดยใช้เฟรม WebKit แบบฝังในหน้าต่าง Gtk (วิธีนี้ทำได้ง่ายที่สุดใน Python) ส่วนที่ยากที่สุดคือการสื่อสารกับระบบจากแอปพลิเคชัน HTML / Javascript ของคุณ

คุณสามารถทำได้โดยส่งข้อความระหว่าง Javascript และ Python อย่างไรก็ตามคุณจะต้องเขียนลอจิกของระบบเป็นฟังก์ชั่น Python แต่มันค่อนข้างง่ายที่จะทำ

นี่คือตัวอย่างง่ายๆที่แสดงการสื่อสารระหว่าง Python และ Javascript ในตัวอย่าง HTML / Javascript แสดงปุ่มที่เมื่อคลิกส่งอาร์เรย์["hello", "world"]ไปยัง Python ซึ่งรวมอาร์เรย์เข้าในสตริง "hello world" และส่งกลับไปที่ Javascript รหัส Python พิมพ์การแทนค่าของอาเรย์ไปยังคอนโซลและโค้ด Javascript จะปรากฏขึ้นในกล่องการแจ้งเตือนที่แสดงสตริง

example.py

import gtk
import webkit
import json
import os

JAVASCRIPT = """
var _callbacks = {};
function trigger (message, data) {
    if (typeof(_callbacks[message]) !== "undefined") {
        var i = 0;
        while (i < _callbacks[message].length) {
            _callbacks[message][i](data);
            i += 1;
        }
    }
}
function send (message, data) {
    document.title = ":";
    document.title = message + ":" + JSON.stringify(data);
}
function listen (message, callback) {
    if (typeof(_callbacks[message]) === "undefined") {
        _callbacks[message] = [callback];
    } else {
        _callbacks[message].push(callback);
    }
}
"""

class HTMLFrame(gtk.ScrolledWindow):
    def __init__(self):
        super(HTMLFrame, self).__init__()
        self._callbacks = {}
        self.show()
        self.webview = webkit.WebView()
        self.webview.show()
        self.add(self.webview)
        self.webview.connect('title-changed', self.on_title_changed)

    def open_url(self, url):
        self.webview.open(url);
        self.webview.execute_script(JAVASCRIPT)

    def open_path(self, path):
        self.open_url("file://" + os.path.abspath(path))

    def send(self, message, data):
        self.webview.execute_script(
            "trigger(%s, %s);" % (
                json.dumps(message),
                json.dumps(data)
            )
        )

    def listen(self, message, callback):
        if self._callbacks.has_key(message):
            self._callbacks[message].append(callback)
        else:
            self._callbacks[message] = [callback]

    def trigger(self, message, data, *a):
        if self._callbacks.has_key(message):
            for callback in self._callbacks[message]:
                callback(data)

    def on_title_changed(self, w, f, title):
        t = title.split(":")
        message = t[0]
        if not message == "":
            data = json.loads(":".join(t[1:]))
            self.trigger(message, data)

def output(data):
    print(repr(data))    

if __name__ == "__main__":
    window = gtk.Window()
    window.resize(800, 600)
    window.set_title("Python Gtk + WebKit App")
    frame = HTMLFrame()
    frame.open_path("page.html")
    def reply(data):
        frame.send("alert", " ".join(data))
    frame.listen("button-clicked", output)
    frame.listen("button-clicked", reply)
    window.add(frame)
    window.show_all()
    window.connect("destroy", gtk.main_quit)
    gtk.main()

page.html

<html>
<body>
<input type="button" value="button" id="button" />
<script>
document.getElementById("button").onclick = function () {
    send("button-clicked", ["hello", "world"]);
};
listen("alert", function (data) {alert(data);});
</script>
</body>
</html>     

รหัสหลามเดียวที่คุณต้องให้ความสนใจจริง ๆ คือรหัสจากdef output(data):ถึงจุดสิ้นสุดไฟล์ซึ่งควรเข้าใจได้ง่าย

เมื่อต้องการเรียกแน่ใจนี้python-webkitและpython-gtk2มีการติดตั้งแล้วบันทึกไฟล์ในโฟลเดอร์เดียวกันและเรียกใช้:

python example.py

โปรแกรมที่ใช้งานจริง


1
นี่มันสุดยอดมาก
Francisco Presencia

5

ฉันพัฒนาBATซึ่งเป็นเครื่องมือขนาดเล็กสำหรับการสร้างแอปพลิเคชันเดสก์ท็อปด้วย HTML, JS และ CSS


ผมเขียนบทความเกี่ยวกับเรื่องนี้ในบล็อกของฉัน

ตัวอย่าง

index.html

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <style>
            body {
                font-family: Monaco, monospace;
                color: white;
                background: #3C3B38;
            }
            h1 { text-align: center; }
            p { text-align: justify; }
            button {
                padding: 10px 20px;
                -moz-border-radius: 4px 4px 4px 4px;
                -webkit-border-radius: 4px 4px 4px 4px;
                border-radius: 4px 4px 4px 4px;
                display: block;
                font-size: 14px;
                text-decoration: none;
                border: 1px solid #c0b7b0;
                cursor: pointer;
                width: 100%;
            }
        </style>
    </head>
    <body>
        <h1>Hello World</h1>
        <p> Ipsum deserunt architecto necessitatibus quasi rerum dolorum obcaecati aut, doloremque laudantium nisi vel sint officia nobis. Nobis ad nemo voluptatum molestiae ad. Nisi ipsum deserunt a illo labore similique ad?  </p>
        <p> Ipsum veniam laborum libero animi quo dignissimos. Possimus quidem consequatur temporibus consequatur odio, quidem deleniti! Similique totam placeat sint assumenda nulla dolor. Voluptatibus quasi veritatis distinctio consectetur nobis. Nemo reprehenderit?  </p>
        <p> Ipsum molestiae nesciunt commodi sint et assumenda recusandae! Earum necessitatibus sequi nulla fugit architecto omnis. Maiores omnis repellat cupiditate iure corporis dolorem sed amet nesciunt. Mollitia sapiente sit repellendus ratione.  </p>
        <p> Consectetur architecto ratione voluptate provident quis. At maiores aliquam corporis sit nisi. Consectetur ab rem unde a corporis reiciendis ut dolorum, tempora, aut, minus. Sit adipisci recusandae doloremque quia vel!  </p>
        <button onclick="BAT.closeWindow()">Close</button>
    </body>
</html>

และเราเรียกใช้วิธีนี้:

bat -d index.html -t "BAT Hello World" -s 800x500

ผลลัพธ์คือ:


4

เท่าที่เข้าถึงแพลตฟอร์มโดยตรงคุณควรตรวจสอบเมล็ดพันธุ์

คุณอาจดูที่UserWebKit , ห้องสมุด Python3 ที่มีฟังก์ชั่นหลักที่ใช้โดย Novacut และ Dmedia UI (มันสร้างขึ้นบนยอดUserCouchและไมโครไฟเบอร์ , BTW)

ฉันคิดว่ามันน่าสนใจกว่าที่จะไม่เข้าถึงแพลตฟอร์มจาก JavaScript โดยตรงเพราะคุณสามารถเลือกใช้ UI ในเบราว์เซอร์มาตรฐานได้หากคุณต้องการ สถาปัตยกรรม Novacutใช้ CouchDB เพื่อให้ UI และแบ็กเอนด์เซิร์ฟเวอร์เครือข่ายโปร่งใส ในกรณีปกติคอมพิวเตอร์เครื่องเดียวเซิร์ฟเวอร์จะทำงานในเครื่องคอมพิวเตอร์ แต่คุณสามารถเรียกใช้เซิร์ฟเวอร์ (และ CouchDB) ในระบบอื่นเช่นกันโดยที่ UI ไม่สังเกตเห็นความแตกต่าง


3

คุณสามารถรวมภาษาที่สามารถเรียกใช้คำสั่งเชลล์เช่น php และด้วยวิธีนี้ใช้ประโยชน์จากสิ่งต่าง ๆ เช่นการติดตั้งแอพจากหน้าเว็บและดำเนินการคำสั่งบางอย่าง (เช่นการตรวจจับชุดรูปแบบที่จะใช้และ CSS ที่จะใช้ ตัวอย่างเช่นคุณมีคำถามสองข้อที่อาจช่วยได้:

เซิร์ฟเวอร์สามารถจัดการคำสั่งเชลล์พร้อมกันได้หรือไม่? (ซึ่งพูดถึงการดำเนินการหลายคำสั่ง)

เรียกใช้คำสั่ง line จากเว็บ (คลิกที่ลิงค์ของเว็บเพจ) (พูดถึงการคลิกที่ลิงค์และติดตั้งแอพจากศูนย์ซอฟต์แวร์)

สำหรับวิธีการเรียนรู้ว่าจะใช้ชุดรูปแบบใดคุณสามารถแยกไฟล์ ubuntu ที่มีค่าสำหรับชุดรูปแบบเริ่มต้นและขึ้นอยู่กับการปรับเปลี่ยน CSS ของเว็บไซต์เพื่อให้สอดคล้องกับชุดรูปแบบใหม่

คำถามเกี่ยวกับชุดรูปแบบและสามารถค้นหาได้ที่นี่:

ไฟล์ใดที่ฉันต้องแก้ไขเพื่อเปลี่ยนสีข้อความในชุดรูปแบบ?

ชุดรูปแบบการลืมเดสก์ทอป?

การแก้ไขชุดรูปแบบ GTK (เพิ่มเส้นขอบ)

ทั้งหมดนี้ (และอื่น ๆ ถ้าคุณใช้การค้นหา) ช่วยให้คุณทราบว่าจะดูเมื่อแยกวิเคราะห์และไฟล์ใดที่คุณสามารถตรวจสอบเพื่อดูว่าชุดรูปแบบระบบใช้และสิ่งที่จะใช้ในหน้าเว็บแล้ว



0

ตอนนี้เรามี AppJS - https://github.com/milani/appjs !

ขณะที่พวกเขากล่าวว่า " มันใช้โครเมี่ยมเป็นหลัก (เพื่อให้ล่าสุด API ที่ได้รับการสนับสนุน HTML5) และ Node.js เป็นกระดูกสันหลัง. "

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.