Don't optimize the wrong thing
You have an excellent review already, so I'll comment on a narrow topic: cramped code layout. For example:
def execute(self,event):
if self.flag: self.command();self.configure(relief='raised')
else: self.configure(relief='raised')
As a species, software engineers are often optimizers. And the problem with optimization is its seductiveness. The thing being optimized (speed, memory, or lines of code) can start to seem independently important -- a legitimate goal in its own right. It almost never is.
Code is read or quickly scanned orders of magnitude more frequently than it is typed. The real enemy in coding is complexity, confusion, and bugs -- not whether you have to type a few extra spaces and newline characters. Do yourself a favor and type the code in a way that optimizes for readability rather than lines of code:
def execute(self, event):
if self.flag:
self.command()
self.configure(relief='raised')
else:
self.configure(relief='raised')
And notice what happens when we do that. By enhancing the visibility of the logical structure, we see that the code inis needlessly repetitive and verbose. So we edit further, ending up with a version that is more compact than the cramped version we started with:
def execute(self, event):
if self.flag:
self.command()
self.configure(relief='raised')