Skip to content
Advertisement

Python code works on cmd and VScode but not on powershell or pyinstaller

I have written a python script to save a book. It takes screenshots, turns pages(pyautogui click) and combines the screenshots into a PDF.

This is what happens on executing code in vscode:

PS C:UsersAdmin> & C:/Users/Admin/AppData/Local/Programs/Python/Python39/python.exe "c:/Users/Admin/Desktop/New folder/Windows_v1.py"
On page 1
On page 2
On page 3
On page 4
Combining PDF
PS C:UsersAdmin> 

This is what happens in cmd

C:UsersAdminDesktopNew folder>python Windows_v1.py
On page 1
On page 2
On page 3
Combining PDF
C:UsersAdminDesktopNew folder>

This is what happens on powershell

PS C:UsersAdminDesktopNew Folder> python Windows_v1.py
On page 1
On page 2

…and it just stays there(tested for 15 minutes).

The script:

# Not in standard library- img2pdf, pyautogui, PIL
import img2pdf
import time
import tkinter as tk
from PIL import ImageGrab
import pyautogui
import os

#Main window creation

# Top level window 
frame = tk.Tk() 
frame.title("Screenshot PDF maker") 
frame.geometry('400x400') 
frame.wm_attributes('-alpha',1)

# Transparent Button Creation 
def makeTrans():
    frame.update()
    frame.wm_attributes('-alpha',0.3)
    frame.update()
    
transButton = tk.Button(frame, 
    text = "Make window transparent for ease", 
    command = makeTrans)


# TextBox Creation 
inplabBookName = tk.Text(frame, 
    height = 2, 
    width = 20) 

inpSaveLoc = tk.Text(frame, 
    height = 2, 
    width = 20) 

inpPageNo = tk.Text(frame, 
    height = 2, 
    width = 20) 

# Create labels for main page
labBookName = tk.Label(frame, text = "Book name") 
labBookName.config(font =("Arial", 8)) 

labIns = tk.Label(frame, text = "Arrange and shape the window so that it covers the entire page.n Do NOT include title bar") 
labIns.config(font =("Arial", 9)) 

labSaveLoc = tk.Label(frame, text = "Location") 
labSaveLoc.config(font =("Arial", 7)) 

labPageNum = tk.Label(frame, text = "Number of pages") 
labPageNum.config(font =("Arial", 7)) 

#Pack everything
labIns.pack()
transButton.pack()
labBookName.pack()
inplabBookName.pack()
labSaveLoc.pack()
inpSaveLoc.pack() 
inpSaveLoc.insert(tk.END, "D:\Books")
labPageNum.pack() 
inpPageNo.pack()
frame.wait_visibility(frame)

#Next Button
var = tk.IntVar()
nextButton = tk.Button(frame, text="Next", command=lambda: var.set(10))
nextButton.pack()

nextButton.wait_variable(var)

#Perpare mouse detection screen

#Remove old elements
labIns.pack_forget()
transButton.pack_forget()
labBookName.pack_forget()
inplabBookName.pack_forget()
labSaveLoc.pack_forget()
inpSaveLoc.pack_forget() 
labPageNum.pack_forget() 
inpPageNo.pack_forget()
nextButton.pack_forget() 
frame.wm_attributes('-alpha', 1)

# Create labels
labMouseX = tk.Label(frame, text = "Mouse X") 
labMouseX.config(font =("Arial", 7)) 

labMouseY = tk.Label(frame, text = "Mouse Y") 
labMouseY.config(font =("Arial", 7))


#text inputs for mouse screen
inpmox = tk.Text(frame, 
    height = 2, 
    width = 20) 

inpmoy = tk.Text(frame, 
    height = 2, 
    width = 20) 

inpWait = tk.Text(frame, 
    height = 2, 
    width = 20) 

autoDetlabIns = tk.Label(frame, text = "Press the button and move your mouse over the Next Button to turn the page. n The co-ords will be picked up 3 seconds after press.") 
autoDetlabIns.config(font =("Arial", 7)) 

waitlabIns = tk.Label(frame, text = "Seconds of delay it takes to change page after clicking")
waitlabIns.config(font =("Arial", 7)) 

startlabIns = tk.Label(frame, text = "This window will disappear. You do not need to move your mouse or press any key. n When the PDF is ready, the program will close itself") 
startlabIns.config(font =("Arial", 7)) 
inpmoy.insert(tk.END, "1")

#buttons for mouse screen
def autodetmouse():
    time.sleep(3)
    temx, temy = pyautogui.position()
    inpmox.delete(1.0, tk.END)
    inpmoy.delete(1.0, tk.END)
    inpmox.insert(tk.END, temx) 
    inpmoy.insert(tk.END, temy)

autodet = tk.Button(frame, 
    text = "Auto detect mouse position", 
    command = autodetmouse)


#Pack everything for mouse screen
labMouseX.pack()
inpmox.pack()
labMouseY.pack()
inpmoy.pack()
autoDetlabIns.pack()
autodet.pack()
waitlabIns.pack()
inpWait.pack()
startlabIns.pack()

# Start button creation
var = tk.IntVar()
startButton = tk.Button(frame, text="Start", command=lambda: var.set(1))
startButton.pack()

frame.update_idletasks()
frame.update()

startButton.wait_variable(var)

 #Remove all elements and make transparent
labMouseX.pack_forget()
labMouseY.pack_forget()
autoDetlabIns.pack_forget()
autodet.pack_forget()
startlabIns.pack_forget()
startButton.pack_forget()

frame.update_idletasks()
frame.update()

frame.wm_attributes('-alpha', 0)

frame.update_idletasks()
frame.update()
#Main processing

def main():
    #Prepare variables for processing
    save_Loc = str(inpSaveLoc.get("1.0", "end-1c"))
    doc = inplabBookName.get("1.0", "end-1c")
    num_pages = int(inpPageNo.get("1.0", "end-1c"))
    waitTime = int(inpWait.get("1.0", "end-1c"))
    varInpMoY = int(inpmoy.get("1.0",'end-1c'))
    varInpMoX = int(inpmox.get("1.0",'end-1c'))
    
    inpmoy.pack_forget()
    imgs = []

    inpmox.insert(tk.END, "processing...") 

    #Fix all inputs
    save_Loc = save_Loc.rstrip('\')
 
    if not os.path.exists(save_Loc):
        os.makedirs(save_Loc)
    
    os.makedirs(save_Loc + "/" + doc)
    pyautogui.moveTo(varInpMoX, varInpMoY) #so that cursor doesn't come in the way

    for pg_num in range(num_pages):
        print('On page', str(pg_num + 1))
        im = ImageGrab.grab(bbox=(frame.winfo_rootx(), frame.winfo_rooty(), frame.winfo_width(), frame.winfo_height()))
        finSavLoc = save_Loc + "/" + doc + "/" + str(pg_num + 1) + ".png"
        im.save(finSavLoc)
        imgs.append(finSavLoc)
        time.sleep(waitTime)

        #Flip page
        pyautogui.moveTo(varInpMoX, varInpMoY)
        pyautogui.click()

    print("Combining PDF")  
    inpmox.insert(tk.END, "Combinig PDF...") 
    with open(save_Loc + "/" + doc + "/" + doc +".pdf" ,"wb") as f:
        f.write(img2pdf.convert(imgs))
 
if __name__ == "__main__":
    main()

I have tried:

  1. Rebooting
  2. Re-installing all the required pip modules

Advertisement

Answer

Turn out the auto-clicker was the problem with PowerShell. Whenever it used to click on the PowerShell command line, it paused. Fixed using this answer: https://serverfault.com/a/205898

User contributions licensed under: CC BY-SA
10 People found this is helpful
Advertisement