Python Tkinter shown before rest of program executed
Question: I'm working on creating a Launcher/updater for my small scale game I'm
building. I have the program create the gui then have it auto start
downloading the version file to check if it needs to be updated. Sadly the
gui, which is made using Tkinter, won't show till after the file is
downloaded. Is there a way to have the file download after the gui shows up?

    
    
    """
    Programmer: JR Padfield
    Description: Downloads file/s from a web server
    Version: 1
    Date: 05/16/15
    """
    
    import urllib2
    import ConfigParser
    import os
    import hashlib
    from Tkinter import *
    import ttk
    from PIL import Image, ImageTk
    
    
    class Launcher(Frame):
    """ Main class for the launcher """
    
    def __init__(self, parent):
        Frame.__init__(self, parent, background="white")
    
        self.parent = parent
        self.parent.title("The World Launcher")
        self.pack(fill=BOTH, expand=1)
    
        # create a lists for the.py checksum
        self.pymd5 = []
        self.pymd5fromini = []
    
        # create a list for the graphics checksum
        self.graphicsmd5 = []
        self.graphicsmd5fromini = []
    
        self.initUI()
    
    def initUI(self):
        """ Intializes the gui interface. """
    
        self.image = Image.open('azurekite.jpg')
        self.tkimage = ImageTk.PhotoImage(self.image)
        canvas = Canvas(self, width=self.image.size[0]+20,
                        height=self.image.size[1]+20)
        canvas.create_image(0, 0, anchor='nw', image=self.tkimage)
        canvas.pack(fill=BOTH, expand=1)
    
        self.playButton = Button(self, text="Play The World", command=self.play)
        self.playButton.place(x=900, y=725)
    
        self.forumButton = Button(self, text="Check Forums", command=self.forums)
        self.forumButton.place(x=780, y=725)
    
        self.newsText = Text(self, height=20, width=40)
        self.newsText.place(x=10, y=10)
        self.newsText.insert(END, "News Text goes here")
        self.newsText.config(state=DISABLED)
    
        self.updateLabel = Label(self, text="Starting Update Checks...")
        self.updateLabel.place(x=50, y=680)
    
        self.updateBar = ttk.Progressbar(self, orient='horizontal', length=400, mode="determinate")
        self.updateBar.place(x=50, y=700)
        self.updateBar["value"] = 0
    
        # calls the first check to get things rolling
        #self.startCheck()
    
    def play(self):
        """ Closes the launcher and plays the game """
    
    def forums(self):
        """ Launches the forums """
    
    def startCheck(self):
        self.updateLabel.config(text="Downloading news and version files")
        try:
            url = "http://removedrealurl.net/game/updates/version.ini"
            hdr = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11',
            'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
            'Accept-Charset': 'ISO-8859-1,utf-8;q=0.7,*;q=0.3',
            'Accept-Encoding': 'none',
            'Accept-Language': 'en-US,en;q=0.8',
            'Connection': 'keep-alive'}
    
            file_name = url.split('/')[-1]
            print(file_name)
            req = urllib2.Request(url, headers=hdr)
            u = urllib2.urlopen(req)
            print("opened url")
            f = open(file_name, "wb")
            meta = u.info()
            file_size = int(meta.getheaders("Content-Length")[0])
            print "Downloading: %s Bytes: %s" % (file_name, file_size)
            self.updateBar["maximum"] = file_size
    
            file_size_dl = 0
            block_sz = 8192
            while True:
                buffer = u.read(block_sz)
                if not buffer:
                    break
    
                file_size_dl += len(buffer)
                f.write(buffer)
                status = r"%10d  [%3.2f%%]" % (file_size_dl, file_size_dl * 100. / file_size)
                status += chr(8) * (len(status) + 1)
                self.updateBar["value"] = file_size_dl
                print status
    
            f.close()
        except urllib2.HTTPError, e:
            print(e)
    
        self.updateLabel.config(text="Reading Version file....")
        config = ConfigParser.ConfigParser()
    
        config.read("version.ini")
        gameweb = config.get('UPDATER', 'GameWebsite')
        updateurl = config.get('UPDATER', 'updateURL')
        versionNum = config.get('UPDATER', 'GameWebsite')
    
        # # get the pyfiles check sum values.
        # pycount = config.get('PYFILES', 'COUNT')
        #
        # for i in range(pycount):
        #     self.pymd5fromini.append(config.get('PYFILES', 'pyfile' + i))
        #
        # # get the graphics check sum
        # gcount = config.getint('GRAPHICS', 'COUNT')
        #
        # for i in range(gcount):
        #     self.graphicsmd5fromini.append(config.get('GRAPHICS', 'graphic' + i))
    
    
        os.rename("version.ini", "oldVersion.ini")
    
    def checksum(self):
        self.updateLabel.config(text="Checking local files....")
        """ Checks all files to see if they have been changed. """
        for file in os.listdir('/TW'):
            if file.endswith('.py'):
                # check the md5. open the file to check the contents.
                with open(file) as checkFile:
                    data = checkFile.read()
                    md5 = hashlib.md5(data).hexdigest()
                    self.pymd5.append(md5)
    
        self.updateLabel.config(text="Checking local graphics....")
        for file in os.listdir('/data/gui'):
            if file.endswith('.png'):
                # check the md5. open the file to check the contents.
                with open(file) as checkFile:
                    data = checkFile.read()
                    md5 = hashlib.md5(data).hexdigest()
                    self.graphicsmd5.append(md5)
    
        for file in os.listdir('/data/items'):
            if file.endswith('.png'):
                # check the md5. open the file to check the contents.
                with open(file) as checkFile:
                    data = checkFile.read()
                    md5 = hashlib.md5(data).hexdigest()
                    self.graphicsmd5.append(md5)
    
        for file in os.listdir('/data/sprites'):
            if file.endswith('.png'):
                # check the md5. open the file to check the contents.
                with open(file) as checkFile:
                    data = checkFile.read()
                    md5 = hashlib.md5(data).hexdigest()
                    self.graphicsmd5.append(md5)
    
        for file in os.listdir('/data/tilesets'):
            if file.endswith('.png'):
                # check the md5. open the file to check the contents.
                with open(file) as checkFile:
                    data = checkFile.read()
                    md5 = hashlib.md5(data).hexdigest()
                    self.graphicsmd5.append(md5)
    
    
    def main():
    """ Launches the program """
    root = Tk()
    root.geometry('1024x768')
    app = Launcher(root)
    root.mainloop()
    
    if __name__ == '__main__':
    main()
    


Answer: I figured out if you throw in self.parent.update() before calling the file
download call the gui will show up before executing the file download def.

