Tkinter и потоки

Итак, я пытаюсь создать окно tkinter, а затем отключить его по экрану без повторного открытия GUI. Первая проблема, с которой я сталкиваюсь, заключается в том, что нить не работает. Программа выбирает только запуск функции deplacewindow и игнорирование кода ниже строки thread.start. Можно ли это исправить? Или есть лучший способ вытеснить окно tkinter через экран?

Вот код:

import tkinter as tk import time,threading root = tk.Tk() # create a Tk root window w = 200 # width for the Tk root h = 200 # height for the Tk root # get screen width and height sw = root.winfo_screenwidth() # width of the screen sh = root.winfo_screenheight() # height of the screen # calculate x and y coordinates for the Tk root window to appear on the # bottom right of the screen x = sw - w - 20 y = sh - h - 80 print (sw,"-",w," ",sh,"-",h) print (x,y) # set the dimensions of the screen # and where it is placed root.geometry('%dx%d+%d+%d' % (w, h, x, y)) def mainloop(): global root root.mainloop() # starts the mainloop def deplaceWindow(): global root,x print ("Starting loop") while 1: time.sleep(1) x-=10 print (x) #root.geometry('%dx%d+%d+%d' % (w, h, x, y)) root.geometry('%dx%d+%d+%d' % (w, h, x, y)) print ("starting thread") threading.Thread(target=deplaceWindow()).start() print ("starting mainloop") mainloop() 

Кажется, что вы хотите, это событие таймера . Для этого TkInter использует метод after :

 root = tk.Tk() # create a Tk root window x = -10 ... def mainloop(): global root print ("Starting loop") # calls to other root methods must come before call to mainloop(). root.after(1000, deplaceWindow) root.mainloop() # starts the mainloop def deplaceWindow(): global root,x print (x) root.geometry('%dx%d+%d+%d' % (w, h, x, y)) x -= 10 root.after(1000, deplaceWindow) # 1000 miliseconds if __name__=="__main__": print ("starting mainloop") mainloop() 

Кроме того: любое взаимодействие с потоком GUI не может быть из других потоков (как объяснил @Bryan_Oakley). У вас может быть функция в главном скрипте, который планирует события, используя метод root.after, но не прямой вызов из внешнего потока.