質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

Q&A

解決済

1回答

652閲覧

GUIに表示される数値をループに応じて変化させたい

Kodanosuke

総合スコア42

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

0グッド

0クリップ

投稿2023/01/27 13:00

前提

GUIからフォルダを選択し,そのフォルダ内に含まれるpdfに処理を行うプログラムを作成しております.
そのなかでフォルダ内に含まれるファイル数と,プログラム実行後にすでに処理が完了しているファイル数を下記コードの「検査したファイル数:」の横にを表示させたいと考えております.
ループの回数に応じてGUI上に表示される数値を変化させていくにはどのようにしたらよろしいでしょうか?
ご教示いただければ幸いです.よろしくお願いいたします.

実現したいこと

GUI上にすでにループが完了した回数の数値を「検査したファイル数:」の横に表示したい

発生している問題・エラーメッセージ

ループ終了後の数字しか表示されていない

該当のソースコード

Python

1 2import os,sys 3from tkinter import * 4import tkinter as tk 5from tkinter import ttk 6from tkinter import messagebox 7from tkinter import filedialog 8import glob 9 10# フォルダ指定の関数 11def dirdialog_clicked1(): 12 iDir = os.path.abspath(os.path.dirname(__file__)) 13 iDirPath = filedialog.askdirectory(initialdir = iDir) 14 entry1.set(iDirPath) 15 16# フォルダ指定の関数 17def dirdialog_clicked2(): 18 iDir = os.path.abspath(os.path.dirname(__file__)) 19 iDirPath = filedialog.askdirectory(initialdir = iDir) 20 entry2.set(iDirPath) 21 22 23# ファイル指定の関数 24def filedialog_clicked(): 25 fTyp = [("", "*")] 26 iFile = os.path.abspath(os.path.dirname(__file__)) 27 iFilePath = filedialog.askopenfilename(filetype = fTyp, initialdir = iFile) 28 entry2.set(iFilePath) 29 30def detectBlackOut(pdf_file): 31 32 print("Detection Black Out Completed") 33 34 35# 実行ボタン押下時の実行関数 36def conductMain(): 37 text = "" 38 39 prePath = entry1.get() 40 postPath = entry2.get() 41 if prePath: 42 text += "検査予定フォルダパス:" + prePath + "\n" 43 if postPath: 44 text += "結果出力フォルダパス:" + postPath 45 46 if text: 47 messagebox.showinfo("info", text) 48 else: 49 messagebox.showerror("error", "パスの指定がありません。") 50 51 files_entry = glob.glob(prePath+'/**/*.pdf', recursive=True) 52 files_entry_num = 500#len(files_entry) 53 54 #検査予定ファイル数の表示 55 entry11 = IntVar() 56 pdfNum_prepre =tk.Label(frame3, text=str(files_entry_num)) 57 pdfNum_prepre.grid(row=0, column=1) 58 59 #検査中ファイル番号の表示 60 for ii in range(files_entry_num): 61 pdfNum_now = tk.Label(frame3, text=str(ii)) 62 pdfNum_now.grid(row=1, column=1) 63 64 #ProgressBarの表示 65 progressbar = ttk.Progressbar(frame5, length=files_entry_num, value=0) 66 progressbar.grid(row=5, column=5) 67 68 69 70 71 72 73 74 print(files_entry) 75 76 77 78 79 80 81 82if __name__ == "__main__": 83 84 # rootの作成 85 root = Tk() 86 root.title("PDF検査") 87 root.geometry("800x400") 88 89 90 #ウィジェットの作成##################################################################### 91 # # Frame1の作成 92 frame1 = tk.Frame(root, bg="tan") 93 frame1.grid(row=0, column=0, sticky=E) 94 95 # 「フォルダ参照」ラベルの作成 96 preDirLabel = tk.Label(frame1, text="検査フォルダ") 97 preDirLabel.grid(row=0, column=0) 98 99 # 「フォルダ参照」エントリーの作成 100 entry1 = StringVar() 101 preDirEntry = tk.Entry(frame1, textvariable=entry1, width=30) 102 preDirEntry.grid(row=1, column=0) 103 104 # 「フォルダ参照」ボタンの作成 105 preButton = tk.Button(frame1, text="参照", command=dirdialog_clicked1) 106 preButton.grid(row=1, column=1) 107 108 # 「出力フォルダ参照」ラベルの作成 109 postDirLabel = tk.Label(frame1, text="出力フォルダ参照") 110 postDirLabel.grid(row=2, column=0) 111 112 # 「出力フォルダ参照」エントリーの作成 113 entry2 = StringVar() 114 postDirEntry = tk.Entry(frame1, textvariable=entry2, width=30) 115 postDirEntry.grid(row=3, column=0) 116 117 # 「出力フォルダ参照」ボタンの作成 118 postDirButton = tk.Button(frame1, text="参照", command=dirdialog_clicked2) 119 postDirButton.grid(row=3, column=1) 120 121 #Frame2の作成:検査範囲 122 frame2 = tk.Frame(root) 123 frame2.grid(row=1, column=4) 124 125 #検査範囲ラベルの作成 126 dataAre = tk.Label(frame2, text="検査範囲") 127 dataAre.grid(row=0, column=0) 128 leftupper = tk.Label(frame2, text="左上") 129 rightupper = tk.Label(frame2, text="右上") 130 leftlower = tk.Label(frame2, text="左下") 131 raightlower = tk.Label(frame2, text="右下") 132 leftupper.grid(row=5, column=0) 133 rightupper.grid(row=6, column=0) 134 leftlower.grid(row=7, column=0) 135 raightlower.grid(row=8, column=0) 136 137 #検査範囲エントリの作成 138 entry3 = IntVar() 139 entry4 = IntVar() 140 entry5 = IntVar() 141 entry6 = IntVar() 142 entry7 = IntVar() 143 entry8 = IntVar() 144 entry9 = IntVar() 145 entry10 = IntVar() 146 unit_between = "mm *" 147 unit_end = "mm" 148 149 data_area_row = [5, 6, 7, 8] 150 151 entry_leftupperV = tk.Entry(frame2, textvariable=entry3, width=30) 152 entry_rightupperV = tk.Entry(frame2, textvariable=entry4, width=30) 153 entry_leftlowerV = tk.Entry(frame2, textvariable=entry5, width=30) 154 entry_rightlowerV = tk.Entry(frame2, textvariable=entry6, width=30) 155 156 entry_leftupperV.grid(row=5, column=1) 157 entry_rightupperV.grid(row=6, column=1) 158 entry_leftlowerV.grid(row=7, column=1) 159 entry_rightlowerV.grid(row=8, column=1) 160 161 162 for i in data_area_row: 163 entry_unit_between = tk.Label(frame2, text=unit_between) 164 entry_unit_between.grid(row=i, column=2) 165 166 entry_unit_end = tk.Label(frame2, text=unit_end) 167 entry_unit_end.grid(row=i, column=4) 168 169 170 entry_leftupperV = tk.Entry(frame2, textvariable=entry7, width=30) 171 entry_rightupperV = tk.Entry(frame2, textvariable=entry8, width=30) 172 entry_leftlowerV = tk.Entry(frame2, textvariable=entry9, width=30) 173 entry_rightlowerV = tk.Entry(frame2, textvariable=entry10, width=30) 174 entry_leftupperV.grid(row=5, column=3) 175 entry_rightupperV.grid(row=6, column=3) 176 entry_leftlowerV.grid(row=7, column=3) 177 entry_rightlowerV.grid(row=8, column=3) 178 179 # Frame3の作成:検査予定ファイル,検査済みファイル数の表示 180 frame3 = tk.Frame(root) 181 frame3.grid(row=1, column=0) 182 pdfNum_pre = tk.Label(frame3, text="検査ファイル数: ") 183 pdfNum_pre.grid(row=0, column=0) 184 185 pdfNum_now = tk.Label(frame3, text="検査したファイル数: ") 186 pdfNum_now.grid(row=1, column=0) 187 188 # frame4:実行ボタンの設置 189 frame4 = tk.Frame(root) 190 frame4.grid(row=1, column=5) 191 button1 = tk.Button(frame4, text="実行", command=conductMain, bg="green") 192 button1.grid(row=0, column=0) 193 194 #frame5:ProgressBarの表示 195 frame5 = tk.Frame(root) 196 frame5.grid(row=2, column=0) 197 198 root.mainloop()

試したこと

forループで回すことで表示される数値が変化するのではないかと考えコードを書いた

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TakaiY

2023/01/27 15:21

今のコードにどのような問題があるのですか?
guest

回答1

0

ベストアンサー

通常のプログラムは1つのプロセスで動作していますので、同時に複数のことはできません。
tkinterなどのGUIプログラムは、画面の更新やイベント(マウスのクリックなど)の処理などをするためのメインループ(mainloop)が担っています。

イベントが発生して、そこに設定されている処理、今回はconductMain()関数が動作している間は、画面の更新が行なわれません。 なので、conductMain関数の中でいくらラベルのテキストを書き換えても画面には反映されないのです。

時間のかかる処理を実行し、その状況を表示したいのであれば、

その1:
その処理を別スレッドや別プロセスで実行し、そのスレッド/プロセスから進捗状況を取得してメインループ内で画面を書き換えなければなりません。

その2:
conductMain()関数のループの中でupdateメソッドを読んで、強制的に画面を更新する。

このあたりの説明は以下のサイトに詳しく出ています。 そこでも書かれていますが、その1を採るのがいいと思います。
https://daeudaeu.com/tkinter-update/

投稿2023/01/27 15:41

TakaiY

総合スコア12743

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問