Почему при обращении из одного метода в другой, выполняется весь метод, а не вызываемая его функция?
Я новичок в программировании, вот моя проблема:
Из метода 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 шт):
def ...
screenRecord()
def ...
Тот код, который вы не хотите чтобы вызывался при импорте модуля, а вызывался только при непосредственном его запуске, нужно прятать в такую конструкцию в самом конце кода:
def ...
def ...
if __name__ == "__main__":
screenRecord()
Теперь при импорте модуля screenRecord вызов метода screenRecord() не будет выполнен. А если непосредственно запустить модуль screenRecord, то будет выполнен.
Возьмите за практику во всех своих файлах прятать всё лишнее за эту конструкцию в конце файла.