Armadilloフォーラム

armadillo-x2でのpython, tkinterエラーについて

nakamori

2023年12月4日 17時24分

お世話になります。

下記リンクを基準として、pythonで記載できるGUIアプリケーションを構築したいと思います。
・6.2.9.1. Wayland を扱う(https://manual.atmark-techno.com/armadillo-x2/armadillo-x2_product_manu…)

上記設定でpodmanコンテナを作成後、「apt install python3-tk」コマンドで
pythonGUIライブラリのtkinterをインストールしました。

サンプルプログラムとして、下記を実行するとエラーが出力されました。

root@13f653a834d1:/# python3
Python 3.9.2 (default, Feb 28 2021, 17:03:44)
[GCC 10.2.1 20210110] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from tkinter import *
>>> root = Tk()
Traceback (most recent call last):
File "", line 1, in
File "/usr/lib/python3.9/tkinter/__init__.py", line 2270, in __init__
self.tk = _tkinter.create(screenName, baseName, className, interactive, wantobjects, useTk, sync, use)
_tkinter.TclError: no display name and no $DISPLAY environment variable

DISPLAYの環境変数が未定義のエラーと思い、(条件異なりますが)
下記リンクを参照に
・X Window Systemを起動するコンテナとGUIアプリを起動するコンテナ間の連携と画面表示について(https://armadillo.atmark-techno.com/forum/armadillo/10849
export DISPLAY=:0やexport DISPLAY=:0.0を試しましたが、

root@13f653a834d1:/# python3
Python 3.9.2 (default, Feb 28 2021, 17:03:44)
[GCC 10.2.1 20210110] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from tkinter import *
>>> root = Tk()
Traceback (most recent call last):
File "", line 1, in
File "/usr/lib/python3.9/tkinter/__init__.py", line 2270, in __init__
self.tk = _tkinter.create(screenName, baseName, className, interactive, wantobjects, useTk, sync, use)
_tkinter.TclError: couldn't connect to display ":0"

この場合、どのような設定変更を行うのが適切でしょうか?
よろしくお願いします。

コメント

tkinterのバックエンドであるtcl/Tkが今の所メジャーな実装でwaylandプロトコルを
サポートしていないので、X Windowsを使う必要があります。

製品マニュアル 「6.2.9.2. X Window System を扱う」
を参考にコンテナを作って、その中で使ってみてください。

参考までですが、Tkを含むtclの実装のうちundroidwish
(https://wiki.tcl-lang.org/page/Binary+Distributions)
はwaylandをサポートしているようですが、とくにメンテも
されてないし、部分的な実装のままでとくにパッケージに
なっていたりはしません。
既に大半のLinuxディストリビューションがXからwaylandに
移行している現在、ややtkの対応は遅れ気味なようです。

tkinterのバックエンドであるtcl/tkが今の所メジャーな実装でwaylandに
未だ対応していないことが原因です。

製品マニュアル 「6.2.9.2. X Window System を扱う」の手順でWeston
ではなくX を起動して、その中で使ってみてください。

参考までにコミュニティの状況としては、実験的なtkを含むtcl実装に
waylandをサポートしてみたundroidwish(https://wiki.tcl-lang.org/page/Binary+Distributions)
というプロジェクトがありますが、2017年ごろからメンテもされていないのでパッケージもありません。
ご存知の通り大半のlinuxディストロがwaylandに移行している中、ややtkの対応は遅れ気味な気はします。

上記の通り、X Window System&Tkinterの組み合わせで実行することが出来ました。
対応いただきありがとうございます。

クローズしている話題ですが、
本件について詳しく知りたいためご教示いただきたいです。
(開発をはじめたばかりの素人です)

■やりたいこと
 tkinterを使用したい
 (過去、ラズパイ+Pythonにて作成したものを移植したい)

■困りごと
 at_ohsawa様のおっしゃっている
 > X を起動して、その中で使ってみてください。
 の具体的な対応がわかりません。

■私の理解
 ①ABOSDE->CREATE NEW PROJECT->G4/X2->Armadillo Setup New Projectし、
  Generate at-debian-image container setup swuにて
  at-debian-image.swuをつくり、Armadilloにインストールする。
  (at-debian-image.conf)

 ②ABOSDE->CREATE NEW PROJECT->G4/X2->Python New Projectし、
  Generate development swuにて
  development.swuをつくり、Armadilloにインストールする?
  (my_project.conf)

 ②のインストールはできないのですが、
 仮に、①のat-debian-image.confと②のmy_project.confの2つのコンテナが用意できても
 うまくいかないのがnakamori様の話かなと思っています。

 じゃあ、at_ohsawa様のおっしゃっている
 > X を起動して、その中で使ってみてください。
 というのは、一体どうやるのだろう?
 というところで手が止まって困っております。

 ①のProjectと②のProjectを合体させて、1つのコンテナをつくるようなProjectをつくるのかな?
 と想像しているのですが、

 「それは見当外れで、○○をするのだよ」
 「このページが参考になるよ」

 など、助言いただけますと助かります。

※なお、以下の開発環境になっています。
 ・ATDEは外部ネットワークにつながっている
 ・ATDEとArmadilloはつながっている(ABOS Webはつかえる)
 ・Armadilloは外部ネットワークにつながっていない(Armadillo上でapt installなどはできない)

> 製品マニュアル 「6.2.9.2. X Window System を扱う」の手順でWeston
> ではなくX を起動して、その中で使ってみてください。

↑こちらの方法で作ったコンテナで開発する。という話ですね。

これは、どういうことかというと、VSCode(ABOSDE)からコンテナを作らずに、
別途XWindowが動くコンテナをArmadillo上で作って、その中でapt等コマンド
実行しているという事です。

なので、マニュアルの基本的な開発で使うABOSDEを、あえて使わない
応用編でのコマンドを使った作業をされています。

(すでに、メジャーなLinuxディストリビューションがXからWaylandに移行し、
当社で利用しているGPUコアのサポートもWayland前提なので、Xは推奨して
いないためABOSDEもWayland(weston)での開発が推奨になっています。
一方で、tkinterのバックエンドのtkはwayland対応が未だ無い状態になって
いるので、世間的には過渡時期にあります)

at_ohsawa様、回答ありがとうございます。

私の開発環境ではArmadilloからapt等でインストールできるようにはしていません。

とすると、確認ですが
「ABOSDEの開発環境でtkinterをつかうことはできない」
と考えてよろしいでしょうか?

YESの場合、
tkinter→別のモノへ移植手術が必要かと考えますが、
本フォーラムでもよくつかわれていそうなABOSDE+Python+GUIの環境を教えていただけますと助かります。

※FlutterのGUIサンプルProjectを動作させましたが、
 Pythonで書かれているわけではないので、このProjectにどうやって作成済みのPythonのプログラムを組み込むのか?
 という点でまた困りそうです。

> YESの場合、
> tkinter→別のモノへ移植手術が必要かと考えますが、
> 本フォーラムでもよくつかわれていそうなABOSDE+Python+GUIの環境を教えていただけますと助かります。

今の所YESです。

ABOSDE自体は応用編のコマンドラインを自動化しているだけで
応用編にあるコマンドラインによる作り方をしても開発も可能です。

それをせず、あえてABOSDEでpythonでGUIというと、そもそも、
あまりpythonのGUI実装でオススメしづらいとことがあります。

もともと、GPUのサポートや商用利用した場合のライセンス
新しいライブラリ環境への追従という点でflutterを選定している
経緯があるからです。

一応、wxWidgertsがwayland上の描画をサポートしているので
wxPythonを使うのは良さそうなのですが、とくにtkinterと
共通実装があるわけではないので、自分がwxPythonで
書き直してテストするのと、コマンドラインベースで
コンテナを作ってとりあえずtkinterを動かすのであれば、
書き直しは圧倒的に工数がかかるので後者を取ります。

既に開発済みという実装について規模や構造がわからないので
程度問題ではあるのですが・・・

> ※FlutterのGUIサンプルProjectを動作させましたが、
>  Pythonで書かれているわけではないので、このProjectにどうやって作成済みのPythonのプログラムを組み込むのか?
>  という点でまた困りそうです。

製品マニュアルにあるarmadillo-demo-experienceはflutterで書かれた
デモアプリをflutterのクリックに応じて起動するランチャーなのですが、
https://pub.dev/packages/process_run
を使ってflutterから任意のコマンドを実行させています。
これはflutterで作ったGUIの見た目だけ使って、処理はコマンドラインアプリで
実装という例になっています

(armadillo-demo-experienceのソースコードは
ATDE上でapt-get source armadillo-demo-experience
するとソースコードが見えますが、その中の
flutter_demo_experience/lib/widget/demo_launch.dart
にコマンドの呼び出し実装があります。 例: isExecution ? shell.kill() : shell.run(executable); )

at_ohsawa様、Flutter選定の経緯含め、詳細な回答ありがとうございます。

流用元のプログラムでは、GUIの部分は大したことはやっていないので、
移植はそれほど大変ではありません。(たぶん)

※ちゃんと調べていませんが、
 てっきり、PythonでFlutterがつかえる?Fletをおすすめされると想像していました。
 フォーラムでも話題がないようなのでつかっている人はいないのですかね。

 →ひとまず、wxPythonで進めてみます。

armadillo-demo-experienceもapt-getして中身を見てみました。
すぐには理解できそうではないことはわかりました…

ただ、将来的に商用利用の検討はしないといけないので、
時間を見つけて勉強するなり、頭の片隅には置いておこうと思います。

ありがとうございました。

ご不便おかけして申し訳ありません。
tkinterの需要面を考え直す機会いただきありがとうございます。

>  てっきり、PythonでFlutterがつかえる?Fletをおすすめされると想像していました。
>  フォーラムでも話題がないようなのでつかっている人はいないのですかね。

こちらも本当に余談ですが、Fletは活発に開発されてはいますが、APIの網羅不足と
ややバグがあるという状況(まだ1.0.0ではないですし)で自分の口からはお勧めしづらい。
というだけで、大枠で動くとは思うでの個人的には使うかもしれません。

また、他言語向けにもflutterのbindingは出ていますが、flutter自体のアップデートが
活発で内部のAPIがかなり激しく廃止されているため、こういった傍流の実装は追従する
のは大変なのかもしれません。
(Armadillo向けとしても、flutter本体の更新に合わせて内部API仕様が変わるため、
組込み向けのengine修正は苦慮しており、感覚は把握しています)

at_ohsawa様、返信ありがとうございます。

いろいろ調べてみたのですが、

> Flet
→なんかWebブラウザアプリのような感じでやりたいことと違うイメージです。

> wxPython
→そもそもインストールが大変そうで早々に諦めました。
 (5時間とか18時間とかムリです…)

というわけで、
また振り出しに戻って「X Window+tkinter」を検討中です。

①at-debian-imageをATDEに入れてあげて
 wget https://armadillo.atmark-techno.com/files/downloads/armadillo-x2/contai…
 podman load -i at-debian-image-v1.0.11.tar

②Python New ProjectでつくったProjectのDockerfileで
 FROM localhost/at-debian-image:latest
 に書き換えて

③その他必要な手続き・・・(よくわかっていません)

というのをやっていけば、
マニュアルに書いてある
「6.2.9.2. X Window System を扱う」
をABOSDE上で実現できるのでは?

と思って進めているのですが、まったくの検討違いでしょうか?

いろいろやってみているものの、
相変わらずHDMIで接続しているモニタ上に
 armadillo login:
のコンソールが出てきてしまっています。