Tkinterでafter_cancel()をし、再度after()を使うと動作が遅れる

Python

1import customtkinter 2import datetime 3import time 4 5class MyButtonFrame(customtkinter.CTkFrame):6 def __init__(self, master, values):7 super().__init__(master)8 self.values = values 9 self.buttons = []10 11 for i, value in enumerate(self.values):12 button = customtkinter.CTkButton(self, text=value)13 if i<5:14 button.grid(row=0, column=i, padx=10, pady=(10, 0), sticky="nw")15 else:#改行して表示16 button.grid(row=1, column=i-5, padx=10, pady=(10, 10), sticky="nw")17 self.buttons.append(button)18 19class Disproom(customtkinter.CTk):20 def __init__(self):21 super().__init__() 22 23 self.title("各部屋制御画面")24 self.geometry("600x300") 25 26 #フレームの作成(ダミーデータで埋める)27 #本格的な描画は末尾の関数で実行28 #------------------------------------------------------------29 #時計フレーム30 self.clock_frame = customtkinter.CTkFrame(self)31 self.clock_frame.grid(row=0, column=0, padx=10, pady=(10, 0), sticky="nw")32 #時計フレーム内のラベル33 self.lblClock_ymd = customtkinter.CTkLabel(self.clock_frame, text="99/99/99")34 self.lblClock_ymd.grid(row=0, column=0, padx=10, pady=(0, 0), sticky="nw")35 self.lblClock_hms = customtkinter.CTkLabel(self.clock_frame, text="99:99:99")36 self.lblClock_hms.grid(row=1, column=0, padx=10, pady=(0, 0), sticky="nw")37 self.lblClock_free = customtkinter.CTkLabel(self.clock_frame, text="")38 self.lblClock_free.grid(row=2, column=0, padx=10, pady=(0, 0), sticky="nw")39 #----------------------------------------------------------40 41 #各窓制御フレーム42 self.window_control_frame = customtkinter.CTkFrame(self)43 self.window_control_frame.grid(row=0, column=3, padx=10, pady=(10, 0), sticky="new")44 #各窓制御フレームの題名45 self.lblwindow_control_caption = customtkinter.CTkLabel(self.window_control_frame, text="天窓制御 ON No.0 制御中 (目標角 99.9°) ")46 self.lblwindow_control_caption.grid(row=0, column=0, padx=10, pady=(0, 0), sticky="nw",columnspan=2)47 #東天窓フレーム48 self.window_frame_east = customtkinter.CTkFrame(self.window_control_frame)49 self.window_frame_east.grid(row=2, column=0, padx=10, pady=(10, 0), sticky="new")50 self.lblwindow_east_1 = customtkinter.CTkLabel(self.window_frame_east, text="東天窓")51 self.lblwindow_east_1.grid(row=0, column=0, padx=10, pady=(0, 0), sticky="nw")52 self.lblwindow_east_2 = customtkinter.CTkLabel(self.window_frame_east, text="No.1")53 self.lblwindow_east_2.grid(row=0, column=1, padx=10, pady=(0, 0), sticky="nw")54 self.lblwindow_east_3 = customtkinter.CTkLabel(self.window_frame_east, text="温度")55 self.lblwindow_east_3.grid(row=0, column=2, padx=10, pady=(0, 0), sticky="nw")56 self.lblwindow_east_4 = customtkinter.CTkLabel(self.window_frame_east, text="角度")57 self.lblwindow_east_4.grid(row=1, column=2, padx=10, pady=(0, 0), sticky="nw")58 self.lblwindow_east_temp = customtkinter.CTkLabel(self.window_frame_east, text="99.9")59 self.lblwindow_east_temp.grid(row=0, column=3, padx=10, pady=(0, 0), sticky="nw")60 self.lblwindow_east_angle = customtkinter.CTkLabel(self.window_frame_east, text="99.9")61 self.lblwindow_east_angle.grid(row=1, column=3, padx=10, pady=(0, 0), sticky="nw")62 #省略63 #---------------------------------------------------------64 65 #--------------------------------------------------------66 #時計を起動67 self.updateClocklbl()68 #各部屋制御ルーチン69 self.Selectroom()70 71 def updateClocklbl(self):72 #再帰呼び出し73 self.lblClock_hms.after(1000, self.updateClocklbl)#1000[ms]74 75 now = datetime.datetime.now() 76 ymd = now.strftime("%y/%m/%d")77 hms = now.strftime("%H:%M:%S")78 #値を更新して再配置79 self.lblClock_ymd = customtkinter.CTkLabel(self.clock_frame, text=ymd)80 self.lblClock_ymd.grid(row=0, column=0, padx=10, pady=(0, 0), sticky="nw")81 self.lblClock_hms = customtkinter.CTkLabel(self.clock_frame, text=hms)82 self.lblClock_hms.grid(row=1, column=0, padx=10, pady=(0, 0), sticky="nw")83 84 85 def Selectroom(self):86 87 #数値設定88 global roomNo 89 global room_reset_flag 90 91 #最大部屋番号ならカウントリセット 92 if roomNo == len(WINNUM_ARRAY):93 room_reset_flag = True94 95 #部屋番号の算出96 if room_reset_flag:97 roomNo = 1#True(リセットした)なら98 room_reset_flag = False#旗を降ろす99 else:100 roomNo += 1#Falseなら101 102 #再帰呼び出しの設定103 #各部屋の制御窓数分の時間を確保104 self.lblClock_hms.after(MAX_SEC*WINNUM_ARRAY[roomNo-1], self.Selectroom)105 106 #各窓制御ルーチン107 self.Selectwindow()108 109 110 def Selectwindow(self):#各部屋表示値計算 111 112 #数値設定113 global windowNo 114 global window_reset_flag 115 global after_id 116 117 #最大窓番号ならカウントリセット 118 if windowNo == WINNUM_ARRAY[int(roomNo)-1]:119 window_reset_flag = True120 self.lblClock_hms.after_cancel(after_id)121 else:122 #再帰呼び出し設定123 after_id = self.lblClock_hms.after(MAX_SEC, self.Selectwindow)124 125 if window_reset_flag:126 windowNo = 1#True(リセットした)なら127 window_reset_flag = False#旗を降ろす128 else:129 windowNo += 1 #Falseなら130 131 #再描画132 self.lblwindow_control_caption.destroy()133 self.lblwindow_control_caption = customtkinter.CTkLabel(self.window_control_frame, text=str(roomNo)+"号室 No."+str(windowNo)+" 制御中")134 self.lblwindow_control_caption.grid(row=0, column=0, padx=10, pady=(0, 0), sticky="nw",columnspan=2)135 136 #デバッグ用137 print("部屋番号:"+str(roomNo),",窓番号:"+str(windowNo))138 139if __name__ == "__main__":140 141 #グローバル定数142 WINNUM_ARRAY=[4,4,4,4,4,4,4]#各部屋の制御窓数を配列で保持143 MAX_SEC=5000#最大窓制御時間[ms]144 145 #グローバル変数146 roomcount=0147 windowcount=0148 room_reset_flag=True149 window_reset_flag=True150 roomNo=0151 windowNo=0152 after_id=0153 154 Disproom = Disproom()155 Disproom.mainloop()156

コメントを投稿

0 コメント