def __init__(self, root, config):
     Tkinter.Frame.__init__(self, root, padx=20, pady=20)
     # define the instance variables
     self.root = root
     self.config = config
     self.buttonwidth = self.calculateButtonWidth()
     self.commandButtons = []
     self.outputWindow = None
     self.outputWindowVisible = True
     self.commandThread = CCommandThread()
     self.buttonsDisabled = False
     """create the dialog and call the main loop"""
     gridwidth = self.config['GridWidth']
     self.root.title(self.config['TitleString'])
     self.root.resizable(0,0)
     self.pack()
     # add a title string to the top
     label = Tkinter.Label(self, text=self.config['LabelString'].decode("string_escape"))
     label.grid(row=0, columnspan=gridwidth, pady=(0, 20))
     # add the buttons for the system command
     nextrow = self.addButtons() + 1
     self.outputWindow = Tkinter.Text(self, width=1, height=15)
     self.outputWindow.grid(row=nextrow, column=0, columnspan=gridwidth, pady=(20, 0), sticky="WENS")
     # show the output window?
     if(config["ShowCommandOutput"]==0):
         self.toggleOutputWindow()
     nextrow += 1
     # add a close-button at left center 
     button = Tkinter.Button(self, text="Close", command=(lambda: CMyToolbox.exitProgram(0)), width=self.buttonwidth)
     button.grid(row=nextrow, column=gridwidth-1, pady=(20, 0))
     # update GUI periodically
     self.master.after(self.UpdateInterval, self.updateGUI)
 def executeCommand(self, command):
     """ execute the command in shell """
     # dont execute two commands at the same time
     if not self.commandThread or self.commandThread.isRunning():
         return
     
     # disable all buttons in GUI.
     self.buttonsDisabled = True
     for button in self.commandButtons:
         button.config(state="disabled")
     
     # clear text in output frame
     self.outputWindow.delete(1.0, "end")
     
     # set the command and start the thread.
     self.commandThread = CCommandThread()
     self.commandThread.setCommand(command)        
     self.commandThread.start()
class CCommandLineLauncher(Tkinter.Frame):
    """A class that represents the applications window"""        

    # static variables
    UpdateInterval = 200

    def executeCommand(self, command):
        """ execute the command in shell """
        # dont execute two commands at the same time
        if not self.commandThread or self.commandThread.isRunning():
            return
        
        # disable all buttons in GUI.
        self.buttonsDisabled = True
        for button in self.commandButtons:
            button.config(state="disabled")
        
        # clear text in output frame
        self.outputWindow.delete(1.0, "end")
        
        # set the command and start the thread.
        self.commandThread = CCommandThread()
        self.commandThread.setCommand(command)        
        self.commandThread.start()
        
    def updateGUI(self):
        """ will be called in GUIs update loop. """
        self.master.after(self.UpdateInterval, self.updateGUI)

        # read output and update output frame
        if self.commandThread and self.commandThread.isRunning():
            lines = self.commandThread.dumpOutputLines()
            for line in lines:
                self.outputWindow.insert("end", line)
            self.outputWindow.see("end")

        # maybe enable all buttons in GUI
        if self.buttonsDisabled and self.commandThread and not self.commandThread.isRunning():
            self.buttonsDisabled = False
            for button in self.commandButtons:
                button.config(state="normal")

        
    def calculateButtonWidth(self):
        """calculate the width of a button according to text sizes"""
        textlen = 0
        for com in self.config["Commands"]:
            if textlen < len(com.text):
                textlen = len(com.text)
        return textlen

    def addButtons(self):
        """add buttons to the grid according to the defined commands"""
        col = 0
        row = 1
        for com in self.config['Commands']:
            print com.text
            button = Tkinter.Button(self, text=com.text, command=(lambda c=com.command: self.executeCommand(c)), width=self.buttonwidth)
            button.grid(row=row, column=col, padx=3, pady=3)
            self.commandButtons.append(button)
            col += 1
            if(col==self.config['GridWidth']):
                col = 0
                row += 1
        return row
           
    def toggleOutputWindow(self):
        """ toggle between showing and not-showing the output window. """
        if(self.outputWindowVisible):
            self.outputWindow.grid_remove()
            self.outputWindowVisible = False
        else:
            self.outputWindow.grid()
            self.outputWindowVisible = True
           
    def __init__(self, root, config):
        Tkinter.Frame.__init__(self, root, padx=20, pady=20)
        # define the instance variables
        self.root = root
        self.config = config
        self.buttonwidth = self.calculateButtonWidth()
        self.commandButtons = []
        self.outputWindow = None
        self.outputWindowVisible = True
        self.commandThread = CCommandThread()
        self.buttonsDisabled = False
        """create the dialog and call the main loop"""
        gridwidth = self.config['GridWidth']
        self.root.title(self.config['TitleString'])
        self.root.resizable(0,0)
        self.pack()
        # add a title string to the top
        label = Tkinter.Label(self, text=self.config['LabelString'].decode("string_escape"))
        label.grid(row=0, columnspan=gridwidth, pady=(0, 20))
        # add the buttons for the system command
        nextrow = self.addButtons() + 1
        self.outputWindow = Tkinter.Text(self, width=1, height=15)
        self.outputWindow.grid(row=nextrow, column=0, columnspan=gridwidth, pady=(20, 0), sticky="WENS")
        # show the output window?
        if(config["ShowCommandOutput"]==0):
            self.toggleOutputWindow()
        nextrow += 1
        # add a close-button at left center 
        button = Tkinter.Button(self, text="Close", command=(lambda: CMyToolbox.exitProgram(0)), width=self.buttonwidth)
        button.grid(row=nextrow, column=gridwidth-1, pady=(20, 0))
        # update GUI periodically
        self.master.after(self.UpdateInterval, self.updateGUI)