前提・実現したいこと
PythonのTkinterを使ってGUIでファイル等を選択し、処理を行うことが出来るアプリを作っています。この処理中にユーザーに処理中であることを知らせる為、プログレスバーを利用しようとしています。しかし、下記のコードにある通りプログレスバーを扱おうとすると進捗状況が反映出来なかったり、アプリが停止してしまいます。原因や解決策が分かる方に教えていただきたいです。
該当のソースコード
Python
1from tkinter import * 2from tkinter import ttk 3import time 4import tkinter as tk 5 6def button_click(): 7 pbval.set(pbval.get() + 1) 8 root.update() 9 10win = tk.Tk() 11win.title("TEST") 12win.geometry("300x700") 13time.sleep(1) 14win.destroy() 15 16#プログレスバー作成 17root = tk.Tk() 18ttk.Style().theme_use('classic') 19root.title('Progress') 20 21root.columnconfigure(0, weight=1) 22root.rowconfigure(0, weight=1) 23 24# Frame 25frame1 = ttk.Frame(root, padding=10) 26frame1.grid(sticky=(N, W, S, E)) 27frame1.columnconfigure(0, weight=1) 28frame1.rowconfigure(0, weight=1) 29 30pbval = IntVar(value=0) 31pb = ttk.Progressbar( 32 frame1, 33 orient=HORIZONTAL, 34 variable=pbval, 35 maximum=5, 36 length=200, 37 mode='determinate') 38pb.grid(row=0, column=0, sticky=(N, E, S, W)) 39 40 41def ok_click(): 42 def button_click(): 43 pbval.set(pbval.get() + 1) 44 root.update() 45 46 button_click() 47 time.sleep(1) 48 49 button_click() 50 time.sleep(1) 51 52 button_click() 53 time.sleep(1) 54 55 button_click() 56 time.sleep(1) 57 58 button_click() 59 time.sleep(1) 60 61 62 63ok_click() 64 65root.mainloop() 66win.mainloop()
試したこと
・.destroyを使って入力窓を消してから処理中にプログレスバーを表示させる → 入力窓が最初から消えてしまい失敗。
回答できなくて申し訳ないですが、
1. 想定している動きがわからないです、300x700のwindowを表示して、そこの上のボタンが押されたらprogressバーが表示されるみたいな感じでしょうか。
2. GUIプログラミングの場合、mainloop()でイベント待ちに入るのが正しいフレームワークの使い方なので、time.sleep()を使ってしまうと、mainloop()に戻れなくなるので、time.sleep()使ってはまずいはずです。
3. あと、mainloop()が2つある状況はまずいはずです。tkとttkのmainloop()を統合するのか、片方しか使わないようにするか。など1つのmainloop()でイベントを待つようにする必要があると思います。
ご質問ありがとうございます。
1.おっしゃる通りです。もう少し詳しく説明すると300*700のwindow上で処理に用いるエクセルファイルを選択しokボタンを押すとok_clickが実行されprogressバーが表示されるようにしたいと考えております。また、実際はok_click中にエクセルファイルを開く挙動や書き込み、保存のような挙動を追加する予定で、その際の進行度合いを確認できるようにprogressバーを作成しようとした次第です。
2.time.sleep()は上記のようにエクセルファイルを開く挙動などを再現するために便宜的に用いたものですので削除いたします。
3.一度統合という線(tk.toplevel)を用いて作成してみます。
言葉足らずで混乱を招き申し訳ございませんでした。その他アドバイスなどございましたらご指摘ください。
回答1件
あなたの回答
tips
プレビュー