Part of the problem you have is that there is no guarantee that the gui thread will initialize before your counter thread runs. To compound the problem, you can't safely access tkinter widgets from any thread except the one that created them. So, even if you solved the start up sequence problem, you still have this other problem to solve.
The good news is, you do not need threads for this problem. In fact, threads makes this problem harder.
If you want to run something every second, use after
to call a function, then have that function use after
to schedule itself to run again in one second.
Here's a rough example:
def counter():
global uptime
uptime += 1
upt_label['text'] = 'Uptime: %s' % uptime
root.after(1000, counter)
Notice how this function will update the label, then arrange for itself to be called again after one second. This may have a little inaccuracy since it's not guaranteed to run precisely one second later. A more accurate solution is to save the time that the program started, then get the current time and do some math. This will give you a more accurate representation over the course of a long running program.