備忘錄_20160105(定位) 修改 回首頁

程式 2026-02-10 17:09:52 1770714592 100
ubuntu + python + google maps

ubuntu + python + google maps

# ubuntu 20.04.6 + gtk 為基底 
# python 3.8.10
# cpu 是 intel 系列

import gi
gi.require_version('Gtk', '3.0')
gi.require_version('WebKit2', '4.0')
from gi.repository import Gtk, WebKit2, Gdk, GLib
import random

# ----------------------------
# 截圖函式
# ----------------------------
def take_screenshot(webview):
    window = webview.get_window()
    if window:
        width, height = webview.get_allocated_width(), webview.get_allocated_height()
        pb = Gdk.pixbuf_get_from_window(window, 0, 0, width, height)
        if pb:
            pb.savev("screenshot.png", "png", [], [])
            print("截圖完成,存檔為 screenshot.png")
    Gtk.main_quit()

# ----------------------------
# 抓 DOM 函式
# ----------------------------
def grab_dom(webview):
    js_code = "document.getElementsByClassName('tUEI8e')[0].textContent;"
    def js_callback(webview, result, user_data):
        value = webview.run_javascript_finish(result).get_js_value()
        print("抓到網頁 title:", value.to_string())
        # 等 DOM 取完再截圖
        take_screenshot(webview)

    webview.run_javascript(js_code, None, js_callback, None)

# ----------------------------
# 網頁載入完成 callback
# ----------------------------
def on_load_changed(webview, event, user_data=None):
    if event == WebKit2.LoadEvent.FINISHED:
        print("網頁載入完成")
        # 延遲 20~25 秒再抓 DOM,不阻塞主迴圈
        delay = random.randint(20, 25)*1000
        GLib.timeout_add(delay, lambda: grab_dom(webview))

# ----------------------------
# 主程式
# ----------------------------
win = Gtk.Window()
win.set_default_size(1920, 1080)
win.set_title("GTK WebView 非阻塞延遲範例")

webview = WebKit2.WebView()
win.add(webview)
win.show_all()

webview.connect("load-changed", on_load_changed)
webview.load_uri("https://www.google.com/maps/dir/嘉里醫藥烏日倉/台中榮民總醫院")

Gtk.main()



import subprocess

# 呼叫另一個 Python 腳本
result = subprocess.run(["python3", "other.py"], capture_output=True, text=True)

# 等待 other.py 執行完畢後再繼續
print("other.py 執行完畢")
print("輸出結果:")
print(result.stdout)