Upload tkinter/Test_Tkinter.py with huggingface_hub
Browse files- tkinter/Test_Tkinter.py +119 -0
tkinter/Test_Tkinter.py
ADDED
|
@@ -0,0 +1,119 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""Test_Tkinter.py - device test for tkinter 8.6.14 Android wheels.
|
| 2 |
+
|
| 3 |
+
IMPORT-LEVEL ONLY (no display needed, no Tk() call): sets up the Android
|
| 4 |
+
bootstrap, imports the _tkinter extension, evaluates Tcl, and checks the
|
| 5 |
+
vendored data. The GUI test (real Tk window via Termux:X11 DISPLAY) is a
|
| 6 |
+
later device phase.
|
| 7 |
+
|
| 8 |
+
Run on-device via PipManager Scripts folder after installing the matching
|
| 9 |
+
tkinter wheel. Pattern: import _tk_android FIRST, then tkinter/_tkinter.
|
| 10 |
+
Exit-code contract: exit 0 iff every check PASSes, else exit 1.
|
| 11 |
+
|
| 12 |
+
Generated by RIMI
|
| 13 |
+
"""
|
| 14 |
+
import os
|
| 15 |
+
import sys
|
| 16 |
+
|
| 17 |
+
PASS = 0
|
| 18 |
+
FAIL = 0
|
| 19 |
+
|
| 20 |
+
|
| 21 |
+
def check(name, cond, detail=""):
|
| 22 |
+
global PASS, FAIL
|
| 23 |
+
if cond:
|
| 24 |
+
PASS += 1
|
| 25 |
+
print("[PASS] %s %s" % (name, detail))
|
| 26 |
+
else:
|
| 27 |
+
FAIL += 1
|
| 28 |
+
print("[FAIL] %s %s" % (name, detail))
|
| 29 |
+
|
| 30 |
+
|
| 31 |
+
print("tkinter device test - python %s" % sys.version.split()[0])
|
| 32 |
+
|
| 33 |
+
# 1. bootstrap import (env setup + native preload)
|
| 34 |
+
try:
|
| 35 |
+
import _tk_android
|
| 36 |
+
check("import _tk_android", True, _tk_android.__file__)
|
| 37 |
+
except Exception as e:
|
| 38 |
+
check("import _tk_android", False, repr(e))
|
| 39 |
+
print("RESULT: %d PASS, %d FAIL" % (PASS, FAIL))
|
| 40 |
+
sys.exit(1)
|
| 41 |
+
|
| 42 |
+
# 2. env vars point at bundled dirs
|
| 43 |
+
try:
|
| 44 |
+
here = os.path.dirname(os.path.abspath(_tk_android.__file__))
|
| 45 |
+
ok = (os.environ.get("TCL_LIBRARY") == os.path.join(here, "tcl8.6")
|
| 46 |
+
and os.environ.get("TK_LIBRARY") == os.path.join(here, "tk8.6")
|
| 47 |
+
and os.environ.get("XLOCALEDIR") == os.path.join(here, "X11", "locale"))
|
| 48 |
+
check("bootstrap env TCL/TK/XLOCALEDIR", ok,
|
| 49 |
+
"TCL=%s" % os.environ.get("TCL_LIBRARY"))
|
| 50 |
+
except Exception as e:
|
| 51 |
+
check("bootstrap env TCL/TK/XLOCALEDIR", False, repr(e))
|
| 52 |
+
|
| 53 |
+
# 3. fonts.conf generated
|
| 54 |
+
try:
|
| 55 |
+
fc = os.environ.get("FONTCONFIG_FILE", "")
|
| 56 |
+
check("fonts.conf generated", os.path.isfile(fc), fc)
|
| 57 |
+
except Exception as e:
|
| 58 |
+
check("fonts.conf generated", False, repr(e))
|
| 59 |
+
|
| 60 |
+
# 4. bundled natives present
|
| 61 |
+
try:
|
| 62 |
+
libs = [os.path.join(here, n) for n in ("libtcl8.6.so", "libtk8.6.so")]
|
| 63 |
+
ok = all(os.path.isfile(p) and os.path.getsize(p) > 100000 for p in libs)
|
| 64 |
+
check("bundled libtcl/libtk present", ok,
|
| 65 |
+
"tcl=%d tk=%d" % tuple(os.path.getsize(p) if os.path.isfile(p) else -1 for p in libs))
|
| 66 |
+
except Exception as e:
|
| 67 |
+
check("bundled libtcl/libtk present", False, repr(e))
|
| 68 |
+
|
| 69 |
+
# 5. _tkinter extension import (resolves from this wheel; app ships none)
|
| 70 |
+
try:
|
| 71 |
+
import _tkinter
|
| 72 |
+
check("import _tkinter", True, _tkinter.__file__)
|
| 73 |
+
except Exception as e:
|
| 74 |
+
check("import _tkinter", False, repr(e))
|
| 75 |
+
print("RESULT: %d PASS, %d FAIL" % (PASS, FAIL))
|
| 76 |
+
sys.exit(1)
|
| 77 |
+
|
| 78 |
+
# 6. headless Tcl interpreter (wantTk=0 -> no display needed)
|
| 79 |
+
try:
|
| 80 |
+
t = _tkinter.create("", "tkintertest", "Tk", 0, 0, 0, 0, None)
|
| 81 |
+
check("headless Tcl interp (wantTk=0)", True, repr(t)[:60])
|
| 82 |
+
except Exception as e:
|
| 83 |
+
check("headless Tcl interp (wantTk=0)", False, repr(e))
|
| 84 |
+
print("RESULT: %d PASS, %d FAIL" % (PASS, FAIL))
|
| 85 |
+
sys.exit(1)
|
| 86 |
+
|
| 87 |
+
# 7. Tcl patchlevel 8.6.14
|
| 88 |
+
try:
|
| 89 |
+
pl = t.call("info", "patchlevel")
|
| 90 |
+
check("Tcl patchlevel 8.6.14", pl == "8.6.14", "got=%s" % pl)
|
| 91 |
+
except Exception as e:
|
| 92 |
+
check("Tcl patchlevel 8.6.14", False, repr(e))
|
| 93 |
+
|
| 94 |
+
# 8. Tcl_Eval arithmetic
|
| 95 |
+
try:
|
| 96 |
+
r = t.call("expr", "6*7")
|
| 97 |
+
check("Tcl expr 6*7=42", str(r) == "42", "got=%s" % r)
|
| 98 |
+
except Exception as e:
|
| 99 |
+
check("Tcl expr 6*7=42", False, repr(e))
|
| 100 |
+
|
| 101 |
+
# 9. clock with tzdata (vendored tzdata/ required for -timezone)
|
| 102 |
+
try:
|
| 103 |
+
r = t.call("clock", "format", 0, "-format", "%Y-%m-%d",
|
| 104 |
+
"-timezone", ":America/New_York")
|
| 105 |
+
check("clock tzdata America/New_York", str(r) == "1969-12-31", "got=%s" % r)
|
| 106 |
+
except Exception as e:
|
| 107 |
+
check("clock tzdata America/New_York", False, repr(e))
|
| 108 |
+
|
| 109 |
+
# 10. stdlib tkinter package still wins for .py (no shadowing) + Tk class
|
| 110 |
+
try:
|
| 111 |
+
import tkinter
|
| 112 |
+
check("stdlib tkinter unshadowed", "tkinter" in tkinter.__file__ and hasattr(tkinter, "Tk"),
|
| 113 |
+
tkinter.__file__[:80])
|
| 114 |
+
except Exception as e:
|
| 115 |
+
check("stdlib tkinter unshadowed", False, repr(e))
|
| 116 |
+
|
| 117 |
+
print("NOTE: GUI test (Tk() window) needs Termux:X11 + DISPLAY=127.0.0.1:0 - later phase")
|
| 118 |
+
print("RESULT: %d PASS, %d FAIL" % (PASS, FAIL))
|
| 119 |
+
sys.exit(0 if FAIL == 0 else 1)
|