Почему при обращении из одного метода в другой, выполняется весь метод, а не вызываемая его функция?

Я новичок в программировании, вот моя проблема:

Из метода main вызываю функцию screenRecorderStop() у метода screenRecord, предварительно импортировав его командой "from screenRecord import screenRecorderStop". Но при выполнении этой части кода, у меня запускается весь метод screenRecord и выполняются не нужные действия.

код метода screenRecord:

import subprocess
import pyautogui as pag
import time
import os
import keyboard as key
from datetime import datetime
from launchTest import launchTest
from screensawer import screensaver

screenRecorder = "C:\\Users\\khalikov_uz\\PycharmProjects\\pythonProject\\Images\\ScreenRecorder.PNG"
record = "C:\\Users\\khalikov_uz\\PycharmProjects\\pythonProject\\Images\\StartRecord.PNG"
saveVideo = "C:\\Users\\khalikov_uz\\PycharmProjects\\pythonProject\\Images\\saveVideo.PNG"
saveVideoPath = "C:\\Users\\khalikov_uz\\PycharmProjects\\pythonProject\\Images\\saveVideoPath.PNG"
userLogin = os.getlogin()
date = datetime.now().strftime("(%d.%m.%Y)")
nameVideo = f"Login -  {userLogin} Date -  {date}"


def screenRecord():
    screensaver()  # Запуск заставки
    subprocess.Popen('C:\\Users\\khalikov_uz\\PycharmProjects\\pythonProject\\FSCapture90\\FSCapture.exe')
    time.sleep(1)
    moveToScreenRecorder = pag.moveTo(screenRecorder, duration=0.2)
    time.sleep(0.5)
    pag.click(moveToScreenRecorder, duration=0.2)
    time.sleep(2)
    moveToRecord = pag.moveTo(record, duration=0.2)
    time.sleep(0.5)
    pag.click(moveToRecord, duration=0.2)
    time.sleep(10)
    pag.hotkey("Ctrl", "F10")
    launchTest()
    time.sleep(3)
    import main


screenRecord()


def screenRecorderStop():
    time.sleep(1)
    pag.hotkey("Ctrl", "F10")
    time.sleep(1)
    moveToSaveVideo = pag.moveTo(saveVideo, duration=0.2)
    time.sleep(1)
    pag.click(moveToSaveVideo)
    time.sleep(2)
    key.write(nameVideo)
    time.sleep(3)
    moveToSaveVideoPath = pag.moveTo(saveVideoPath, duration=0.2)
    time.sleep(0.5)
    pag.click(moveToSaveVideoPath, duration=0.2)
    time.sleep(3)
    os.system("taskkill /im wmplayer.exe /f")
    os.system("taskkill /im FSRecorder.exe /f")
    time.sleep(2)
    os.system("taskkill /im FSCapture.exe /f")

код метода main:

import time
import tkinter as tk
import os
from tkinter import *
from tkinter import messagebox
from PIL import ImageTk, Image
from screenRecord import screenRecorderStop


root = tk.Tk()  # Создание окна приложения
ico = Image.open("C:\\Users\\khalikov_uz\\PycharmProjects\\pythonProject\\Images\\zaslon.png")  # Путь к иконке шапки
photo = ImageTk.PhotoImage(ico)  # Для работы иконки шапки
root.wm_iconphoto(False, photo)  # Для работы иконки шапки
root.attributes("-topmost", True)  # Поверх всех окон
root.geometry('300x45+1615+70')  # Первые две цифры - размеры окна, вторые две - расположение при запуске.
root.title("ZASLON Timer")  # Название в шапке
root.resizable(False, False)  # Запрет на изменение размеров

hour = StringVar()  # Переменная
minute = StringVar()  # Переменная
second = StringVar()  # Переменная
empty = StringVar()  # Переменная
empty2 = StringVar()  # Переменная

hour.set("0")  # Задаем начальные значения переменным
minute.set("30")  # Задаем начальные значения переменным
second.set("00")  # Задаем начальные значения переменным
empty.set(":")  # Задаем начальные значения переменным
empty2.set(":")  # Задаем начальные значения переменным

hourEntry = Entry(root, width=2, relief=FLAT, font=("Arial", 21), justify='center', fg='#B22222', bg='#ededed',
                  textvariable=hour)
hourEntry.place(x=6, y=4)

emptyEntry2 = Entry(root, width=1, relief=FLAT, font=("Arial", 21), justify='center', bg='#ededed', fg='#B22222',
                    textvariable=empty)
emptyEntry2.place(x=35, y=2)

minuteEntry = Entry(root, width=2, relief=FLAT, font=("Arial", 21), justify='center', bg='#ededed', fg='#B22222',
                    textvariable=minute)
minuteEntry.place(x=55, y=4)

emptyEntry = Entry(root, width=1, relief=FLAT, font=("Arial", 21), justify='center', bg='#ededed', fg='#B22222',
                   textvariable=empty)
emptyEntry.place(x=90, y=2)

secondEntry = Entry(root, width=2, relief=FLAT, font=("Arial", 21), justify='center', bg='#ededed', fg='#B22222',
                    textvariable=second)
secondEntry.place(x=105, y=4)


def submit():  # Действия при нажатии на кнопку Start
    change_start_for_on_click()
    temp = 0 * 3600 + 00 * 60 + 10  # 1 часы, 3 минуты, 5 секунды

    while temp > -1:
        mins, secs = divmod(temp, 60)
        hours = 0


        if mins > 60:
            hours, mins = divmod(mins, 60)
        hour.set("{0:2d}".format(hours))
        minute.set("{0:2d}".format(mins))
        second.set("{0:2d}".format(secs))

        root.update()
        time.sleep(1)

        if temp == 0:
            messagebox.showerror("Закончилось время", "Время вышло! Вы не сдали тест!")
            os.system("taskkill /f /im chrome.exe 1> logs 2>&1")
            os.system("taskkill /f /im OmpClimApp.exe 1> logs 2>&1")
            os.system("taskkill /im wmplayer.exe /f")
            os.system("taskkill /im FSRecorder.exe /f")
            time.sleep(2)
            os.system("taskkill /im FSCapture.exe /f")
            quit()
        if btn_close["bg"]=="#F0E68C": #если кнопка стоп нажата, тормозит таймер и записывает данные в переменную
            timesInfo = "Времени осталось: " + str(hours) + " : " + str(mins) + " : " + str(secs)
            os.system("taskkill /f /im chrome.exe 1> logs 2>&1")
            os.system("taskkill /f /im OmpClimApp.exe 1> logs 2>&1")
            screenRecorderStop()

        temp -= 1


btn = Button(root, text='Start', bd='3', command=submit, font=("Helvetica", 13),
                          fg='#B22222')  # Starts testing
btn.pack(padx=[50, 5], pady=3)


def change_start_for_on_click():
    change_stop_for_off_click()
    btn["bg"] = "#F0E68C"
    btn["fg"] = "#000000"
    btn["font"] = "Helvetica ", 13, "bold"

def change_start_for_off_click():
    btn["bg"] = "#f0f0f0"
    btn["fg"] = "#B22222"
    btn["font"] = "Helvetica ", 13

def change_stop_for_on_click():
    change_start_for_off_click()
    btn_close["bg"] = "#F0E68C"
    btn_close["fg"] = "#000000"
    btn_close["font"] = "Helvetica ", 13, "bold"
    btn.pack_forget()

def change_stop_for_off_click():
    btn_close["bg"] = "#f0f0f0"
    btn_close["fg"] = "#B22222"
    btn_close["font"] = "Helvetica ", 13

def disable_event():
    pass



btn_close = Button(root, text="Stop", bd='3', command=change_stop_for_on_click,
                                font=("Helvetica ", 13),
                                fg='#B22222')  # Button for close programs
btn_close.place(x=210, y=3)
root.protocol("WM_DELETE_WINDOW", disable_event)

submit()
root.mainloop()

Запускаю программы происходит из метода screenRecord, да, я знаю что это г**** код, и что нужно запускать из main, но в силу своей неопытности, я начал писать программу в основном методе просто без классов, и теперь у меня не получается все это закинуть в класс, выдает еще больше ошибок.

Вторая проблема связана также с этими методами, в методе screenRecord после определенных действий мне нужно было запустить метод main, для запуска таймера, но если его объявить вверху программы, то он запускался сразу, что не соответствовало моим ожиданиям, и я запихнул импорт метода прям в функцию, в то время когда мне нужен запуск этого таймера, в целом я проблему решил, но понимаю что это полные "вилы"...

Буду благодарен за любую помощь!)


Ответы (1 шт):

Автор решения: CrazyElf
def ...

screenRecord()

def ...

Тот код, который вы не хотите чтобы вызывался при импорте модуля, а вызывался только при непосредственном его запуске, нужно прятать в такую конструкцию в самом конце кода:

def ...

def ...

if __name__ == "__main__":
    screenRecord()

Теперь при импорте модуля screenRecord вызов метода screenRecord() не будет выполнен. А если непосредственно запустить модуль screenRecord, то будет выполнен.

Возьмите за практику во всех своих файлах прятать всё лишнее за эту конструкцию в конце файла.

→ Ссылка