Я пишу свое первое приложение на Python за последние 20 лет.У меня проблема с функцией tag_add () виджета Tkinter Text.Добавление тега работает только в первый раз, но не во второй раз.Я проверил с помощью tag_names (), был ли мой тег удален при снятии флажка «Highlight Errors».И это удалено.Он даже повторно добавляется при повторной проверке кнопки, но текст не окрашивается со второй попытки.
У кого-нибудь есть идея?Будучи первым кодом на Python за многие годы, вы хотите узнать, как я его реализовал и структурировал?(Извините, не могу убежать от CamelCase)
Заранее спасибо SLi
from Tkinter import Tk, BOTH, END, N, W, S, TOP, BOTTOM, INSERT, LEFT, RIGHT, SUNKEN, RAISED, X, Y, PanedWindow, Frame, LabelFrame, Scrollbar, Checkbutton, Entry, Button, Label, Text, Menu, IntVar
from ScrolledText import ScrolledText
class Application(Frame):
def __init__(self, parent):
Frame.__init__(self, parent)
self.parent = parent
self.initializeUiVariables()
self.doWindowSetup()
self.createWidgets()
self.doColorSetup()
def doWindowSetup(self):
self.parent.title('PACE Client Log Viewer')
self.screenWidth = self.parent.winfo_screenwidth()
self.screenHeight = self.parent.winfo_screenheight()
desiredWindowWidth = (self.screenWidth * 1.0)
desiredWindowHeight = (self.screenHeight * 1.0)
x = (self.screenWidth / 2) - (desiredWindowWidth / 2)
y = (self.screenHeight / 2) - (desiredWindowHeight / 2)
self.parent.geometry('%dx%d+%d+%d' % (desiredWindowWidth, desiredWindowHeight, x, y))
def initializeUiVariables(self):
self.fontSize = 12
self.highlightErrors = IntVar()
def createWidgets(self):
panedWindow = PanedWindow(sashrelief=RAISED)
panedWindow.pack(fill=BOTH, expand=1)
self.wText = ScrolledText(panedWindow)
self.wText.config(font=("consolas", self.fontSize))
self.wText.pack(side=LEFT, fill=BOTH, expand=True)
panedWindow.add(self.wText, minsize=(self.screenWidth * 0.75))
self.wText.insert(END, "2018-09-28 11:15:03 GMT - my.app.id (ERROR): Class:CertChecker:error: No certificate loaded. Load certificate before continuing.\n2018-09-28 11:15:07 GMT - my.app.id (INFO): Class:PerformInitialization: begin - version 0.3.10")
frameToolbar = Frame(panedWindow, padx=10)
frameToolbar.pack(side=LEFT, fill=BOTH, expand=True)
panedWindow.add(frameToolbar)
# Highlight Options
frameHighlightOptions = LabelFrame(frameToolbar, text="Highlight", padx=5, pady=5)
frameHighlightOptions.pack(side=TOP, fill=BOTH)
cbErrors = Checkbutton(frameHighlightOptions, text="Errors", anchor=W, padx=5, justify=LEFT, variable=self.highlightErrors, command=self.onHighlightErrors)
cbErrors.pack(side=TOP, fill=X)
def doColorSetup(self):
self.wText.tag_config("highlightError", background="#EE2C2C", foreground="#FFFFFF") # red
def onHighlightErrors(self):
if self.highlightErrors.get() == 0:
self.wText.tag_delete("highlightError")
else:
self.highlightRow("error", "highlightError")
def highlightRow(self, pattern, tag):
self.highlightPattern(pattern, tag, True)
def highlightPattern(self, pattern, tag, highlightRow=False):
start = self.wText.index("1.0")
end = self.wText.index(END)
self.wText.mark_set("matchStart", start)
self.wText.mark_set("matchEnd", start)
self.wText.mark_set("searchLimit", end)
count = IntVar()
while True:
index = self.wText.search(pattern, "matchEnd","searchLimit", count=count, regexp=True, nocase=True)
if index == "": break
if count.get() == 0: break # degenerate pattern which matches zero-length strings
if highlightRow:
row, col = index.split('.')
self.wText.mark_set("matchStart", "%s.%s" % (int(row), 0))
else:
self.wText.mark_set("matchStart", index)
if highlightRow:
lineEndIndex = self.wText.search("\n", index, "searchLimit", count=count, regexp=False, nocase=False)
row, col = lineEndIndex.split('.')
self.wText.mark_set("matchEnd", lineEndIndex)
else:
self.wText.mark_set("matchEnd", "%s+%sc" % (index, count.get()))
self.wText.tag_add(tag, "matchStart", "matchEnd")
def main():
root = Tk()
ex = Application(root)
root.mainloop()
if __name__ == '__main__':
main()