[3.6] bpo-31493: Fix code context update and font update timers. (GH-… · python/cpython@b417332
@@ -22,15 +22,14 @@
2222UPDATEINTERVAL = 100 # millisec
2323FONTUPDATEINTERVAL = 1000 # millisec
242425-getspacesfirstword =\
26- lambda s, c=re.compile(r"^(\s*)(\w*)"): c.match(s).groups()
25+def getspacesfirstword(s, c=re.compile(r"^(\s*)(\w*)")):
26+return c.match(s).groups()
272728282929class CodeContext:
30-bgcolor = idleConf.GetOption("extensions", "CodeContext",
31-"bgcolor", type="str", default="LightGray")
32-fgcolor = idleConf.GetOption("extensions", "CodeContext",
33-"fgcolor", type="str", default="Black")
30+bgcolor = "LightGray"
31+fgcolor = "Black"
32+3433def __init__(self, editwin):
3534self.editwin = editwin
3635self.text = editwin.text
@@ -43,19 +42,25 @@ def __init__(self, editwin):
4342# starts the toplevel 'block' of the module.
4443self.info = [(0, -1, "", False)]
4544self.topvisible = 1
46-self.reload()
4745# Start two update cycles, one for context lines, one for font changes.
48-self.text.after(UPDATEINTERVAL, self.timer_event)
49-self.text.after(FONTUPDATEINTERVAL, self.font_timer_event)
46+self.t1 = self.text.after(UPDATEINTERVAL, self.timer_event)
47+self.t2 = self.text.after(FONTUPDATEINTERVAL, self.font_timer_event)
50485149@classmethod
5250def reload(cls):
5351cls.context_depth = idleConf.GetOption("extensions", "CodeContext",
5452"numlines", type="int", default=3)
55-cls.bgcolor = idleConf.GetOption("extensions", "CodeContext",
56-"bgcolor", type="str", default="LightGray")
57-cls.fgcolor = idleConf.GetOption("extensions", "CodeContext",
58-"fgcolor", type="str", default="Black")
53+## cls.bgcolor = idleConf.GetOption("extensions", "CodeContext",
54+## "bgcolor", type="str", default="LightGray")
55+## cls.fgcolor = idleConf.GetOption("extensions", "CodeContext",
56+## "fgcolor", type="str", default="Black")
57+58+def __del__(self):
59+try:
60+self.text.after_cancel(self.t1)
61+self.text.after_cancel(self.t2)
62+except:
63+pass
59646065def toggle_code_context_event(self, event=None):
6166if not self.label:
@@ -74,24 +79,19 @@ def toggle_code_context_event(self, event=None):
7479border = 0
7580for widget in widgets:
7681border += widget.tk.getint(widget.cget('border'))
77-self.label = tkinter.Label(self.editwin.top,
78-text="\n" * (self.context_depth - 1),
79-anchor=W, justify=LEFT,
80-font=self.textfont,
81-bg=self.bgcolor, fg=self.fgcolor,
82-width=1, #don't request more than we get
83-padx=padx, border=border,
84-relief=SUNKEN)
82+self.label = tkinter.Label(
83+self.editwin.top, text="\n" * (self.context_depth - 1),
84+anchor=W, justify=LEFT, font=self.textfont,
85+bg=self.bgcolor, fg=self.fgcolor,
86+width=1, #don't request more than we get
87+padx=padx, border=border, relief=SUNKEN)
8588# Pack the label widget before and above the text_frame widget,
8689# thus ensuring that it will appear directly above text_frame
8790self.label.pack(side=TOP, fill=X, expand=False,
8891before=self.editwin.text_frame)
8992else:
9093self.label.destroy()
9194self.label = None
92-idleConf.SetOption("main", "Theme", "contexton",
93-str(self.label is not None))
94-idleConf.SaveUserCfgFiles()
9595return "break"
96969797def get_line_info(self, linenum):
@@ -172,14 +172,14 @@ def update_code_context(self):
172172def timer_event(self):
173173if self.label:
174174self.update_code_context()
175-self.text.after(UPDATEINTERVAL, self.timer_event)
175+self.t1 = self.text.after(UPDATEINTERVAL, self.timer_event)
176176177177def font_timer_event(self):
178178newtextfont = self.text["font"]
179179if self.label and newtextfont != self.textfont:
180180self.textfont = newtextfont
181181self.label["font"] = self.textfont
182-self.text.after(FONTUPDATEINTERVAL, self.font_timer_event)
182+self.t2 = self.text.after(FONTUPDATEINTERVAL, self.font_timer_event)
183183184184185185CodeContext.reload()