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

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

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

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

Q&A

解決済

1回答

372閲覧

自作モジュールのインポートでスレッド化がうまくいかない

yumekichi

総合スコア16

Python 3.x

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

0グッド

0クリップ

投稿2019/06/19 12:32

pythonを勉強して1年程の初心者です。
数種類の計算処理を組みこんで、自動化したく取り組んでいます。
メニュー画面から計算OKのボタンクリックでサブ画面を表示して作業の進捗状況を
プログレスバーとコメント文で表示したいのですがプログレスはOKですが
コメント文が最後のコメントしか表示されません。(途中のコメント文)

他を参照しながらスレッド化が必要とのことで、苦労しながら希望する動作が出来ましたが、
数種類の計算をするために、サブ画面と進捗状況(数種の計算)を分けて2モジュール化
サブ画面NO1(共通)✙進捗状況NO2にしたいと思ってます。質問にあたり疑似サンプルを作ってみました。
なんせ見まねで覚えたので基本ができてないようですみません。どこに問題かご教授お願いします。

エラーメッセージは、有りませんがNO2appli.pyの34行のコメント文が表示されません

該当のソースコード

python3.6

1#################### 2NO1appli.py 3 4import tkinter as tk 5import tkinter.ttk as ttk 6 7 8class SampleApp(tk.Frame): 9 10 def __init__(self, app): 11 super().__init__(app) 12 13 self.pack() 14 label = tk.Label(self,text="計算しますか?") 15 label.grid(row = 0,column = 0,pady= 60,padx= 10) 16 button1 = tk.Button(self,text="OK",command = self.open ) 17 button1.grid(row = 0,column = 1,pady= 60,padx= 10) 18 button2 = tk.Button(self,text="終了",command = self.click ) 19 button2.grid(row = 0,column = 2,pady= 60,padx= 10) 20 21 22 #パラメータを入力するモーダルダイアログを開く 23 def open(self): 24 25 self.dialog = tk.Toplevel(self) 26 self.dialog.title("計算状況表示画面") 27 self.dialog.geometry("300x150+200+300") 28 # modalに 29 self.dialog.grab_set() 30 self.paramdialog = tk.StringVar() 31 32 startButton = tk.Button(self.dialog, text="開始", command=self.kaisi) 33 startButton.grid(row = 0,column = 0,pady= 10,padx= 60 ) 34 35 closeButton = tk.Button(self.dialog, text="閉じる", command=self.close) 36 closeButton.grid(row = 0,column = 1,pady= 10,padx= 10) 37 38 #Progressbar作成 39 val = 0 40 self.progress = ttk.Progressbar( 41 self.dialog, 42 orient = tk.HORIZONTAL, #水平方向に表示 43 length = 200, #長さ 44 mode = 'determinate' #又は、indeterminate 45 ) 46 self.progress.configure(maximum=100, value=val) 47 self.progress.grid(row=1,column=0,columnspan =2,padx = 40 ,pady = 6 ) 48 self.progress.configure(value=val) 49 self.progress.update() 50 51 self.dia0_label = tk.Label(self.dialog, text = "進捗状況を表示します" ) 52 self.dia0_label.grid(row=2,column=0,sticky = tk.W,padx = 30,pady= 10) 53 54 N = 0 55 self.dia1_label = tk.Label(self.dialog, text = str(N),fg = 'red' ) 56 self.dia1_label.grid(row=2,column=1,sticky = tk.W,padx = 10,pady= 10) 57 58 59 def kaisi(self): 60 import NO2appli 61 NO2appli.main(self) ##サブモジュール呼出し 62 63 def close(self): 64 self.dialog.destroy() 65 66 def click(self): 67 app.destroy() 68 69 70if __name__ == '__main__': 71 #Tkインスタンスを作成し、app変数に格納する 72 app = tk.Tk() 73 #縦幅400横幅300に画面サイズを変更します。 74 app.geometry("300x150") 75 #タイトルを指定 76 app.title("Modal Dialog Sample Program") 77 # #フレームを作成する 78 frame = SampleApp(app) 79 # 格納したTkインスタンスのmainloopで画面を起こす 80 app.mainloop() 81################################## 82NO2appli.py 83 84import tkinter as tk 85import tkinter.ttk as ttk 86from time import sleep 87import threading as th 88 89 90class Sample(): 91 92 def __init__(self, dia): 93 94 self = dia 95 th.Thread(target= Sample.run(self)).start() # スレッド開始 96 97 def run(self): 98 99 stop_fg = False 100 AA = 20 101 val = 0 102 103 while stop_fg != True : #### 作業1 ### 104 for a in range(AA) : 105 N = a+1 106 val = int(N/AA * 100 ) 107 self.progress.configure(value=val) 108 self.progress.update() 109 110 sleep(0.5) 111 self.dia1_label["text"]=str(N) 112 if N == AA : 113 stop_fg = True 114 115 self.dia2_label = tk.Label(self.dialog, text = '作業1は終了しました!',fg = 'red',bd=0 ) 116 self.dia2_label.grid(row=3,column=0,columnspan =2,sticky = tk.W,padx = 60,pady= 0) 117 118 sleep(2) 119 self.dia2_label.grid_remove() ## 非表示 120 121 122 stop_fg = False 123 AA = 10 124 val = 0 125 126 while stop_fg != True : ### 作業2 ### 127 for a in range(AA) : 128 N = a+1 129 val = int(N/AA * 100 ) 130 self.progress.configure(value=val) 131 self.progress.update() 132 133 sleep(0.5) 134 self.dia1_label["text"]=str(N) 135 if N == AA : 136 stop_fg = True 137 138 self.dia2_label.grid() ## 表示 139 self.dia2_label["text"] = '作業2は終了しました!' 140 141 sleep(2) 142# self.dialog.destroy() 143 144def main(dia): 145 sub = Sample(dia) 146

試したこと

作業1,2を外してもコメント表示されません。self.dialog.destroy() させると何もなく閉じられる。

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

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

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

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

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

guest

回答1

0

ベストアンサー

エラーメッセージは、有りませんがNO2appli.pyの34行のコメント文が表示されません

34行行目の処理のあとにself.dialog.update_idletasks() を入れてみてください

Python

1self.dia2_label = tk.Label( 2 self.dialog, text='作業1は終了しました!', fg='red', bd=0) 3self.dia2_label.grid(row=3, column=0, columnspan=2, 4 sticky=tk.W, padx=60, pady=0) 5self.dialog.update_idletasks()

投稿2019/06/20 10:48

magichan

総合スコア15898

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

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

yumekichi

2019/06/21 02:11

早速のご回答ありがとうございます。 早速やってみたら希望どうりできました。なにが悪かったかわかりませんが 勉強してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問