bottleのローカルサーバーを利用した、ローカルアプリを作っています(ブラウザで稼働)。
ローカルにあるファイルを取得して利用する処理を実装しようとしているのですが、
途中で、ユーザーにフォルダやファイルの場所を選択してもらおうと思っています。
それでブラウザ上の操作によって、ファイルダイアログを開きたいです。
そのために以下のようなものを作ってみました。
python
1import tkinter,tkinter.messagebox,tkinter.filedialog 2 3@route('/dialog') 4def dialog(): 5 6 7 root = tkinter.Tk() 8 root.withdraw() 9 10 fTyp=[("","*")] 11 fnames=tkinter.filedialog.askopenfilenames(filetypes=fTyp)
URLに対して、tkinterを使ったファイルダイアログを割り当てました。
そのURLにアクセスしたらファイルダイアログを開くようにしたいという考えです(実際にはajaxを併用します)。
しかし上記のようにしてみたところ、なんの反応もなく、ダイアログは開きません。
上記のコード自体は普通にローカルで実行すれば正常に動作します。
どこが問題なのでしょうか。
ご指導お願いします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答2件
0
ベストアンサー
恐ろしく遅くなりましたが、解決しました。
1 モジュール呼び出しならOK
bottleのメインプログラム内に直接tkinterのコードを書くと、ダイアログが出ませんでした。
しかしモジュール内にtkinterのコードを書き、それをインポートして呼び出すと問題無く動きました。
理屈がよく分かりませんが、これが一番簡単な解決かもしれません。
2 subprocessもOK
上記に気付かず、先にsubprocessを使う方法を試しました。これでもファイルダイアログを動かすことができました。
もしかしたら利用場面があるかもしれませんし、せっかくなので載せておきます。
subprocessとして、tkのファイルダイアログを作ります。取得したパス(文字列)はprintで戻します。
bottle側からは、Popenでsubprocessを動かし、printされた結果を受けとります。
相対パスだとうまく動きませんでした。
bottle側
python
1import subprocess as sbp 2proc = sbp.Popen(["python",r"fullpath-----xxx.py"],shell=True,stdout=sbp.PIPE,stderr=sbp.PIPE) 3out,err = proc.communicate()
subprocess側
python
1import tk 2import tkinter.filedialog as tkfdg 3 4root = tk.Tk() 5root.withdraw() 6dir = tkfdg.askdirectory() 7print(dir)
★追記★
その後あれこれやっていたところ、上記の方法でも不安定なことが分かりました。動かないことがあります。
最終的にはファイルを分けて、
os.startfile
を使うと間違いなく起動するようです。
この場合完全に別のプロセスとして動いてしまいますが、一応の目的は達成できます。
★追記2★
wxpythonを使うと全く問題無く作動しました。tkの特性なのでしょうか。
投稿2018/10/07 11:26
編集2018/10/29 09:32退会済みユーザー
総合スコア0
0
[ブラウザ] <= HTTP => [サーバー]
bottle
はサーバー側で動きます。
質問文の動作を行いたい時は、htmlを生成して<input type=”file”>
タグでファイルを選択して、
アップロードする形に変更してくださいな。
投稿2018/08/13 04:59
編集2018/08/13 05:04総合スコア5846
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/08/13 15:16 編集
退会済みユーザー
2018/08/14 00:04 編集
2018/08/14 01:42 編集
退会済みユーザー
2018/08/14 02:57
退会済みユーザー
2018/08/14 04:09
2018/08/14 04:19 編集
退会済みユーザー
2018/08/15 09:04
2018/08/15 09:58
2018/08/15 10:08 編集
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。