Здравствуйте!
Преамбула: Я исследователь в области спектроскопии наноматериалов. Я пользуюсь спетрометром, железо которого управляется программой “wire” с графическим интерфейсом на компьютере под операционной системой виндоус XP без доступа в интернет. Эта данность, которую я поменять не в силах - спектрметром пользуюсь не один и замена компьютера на совреенный с современным софтом остановит проекты десятков людей на неопределенное время.
Сущесвтенная часть моего рабочего времеи уходит на стандартизированные и рутинные измерения - т.е. мое учатие заключается в том, что нужно много раз повторить определенне движения мышкой и ввести команды с клавиатуры и иногда принимать несложные решения о дальнейших действиях в зависимости от того, какие я вижу спетры. Я захотел эту процедуру автоматизироватть.
Поскольку wire не поддерживает API (я узнавал у производителя) я пошел обходным путем: Я скачал программу wire (это та которая упправляет спектрометром) на свой персональный ноутбук, и написал питон программу, которая эмулирует нажатия клавиш на клавиатуре и движения мышкой в нужной мне последовательности (а также просматривает txt файлы со спектрами, которые генерируются программой wire в процессе работы спектрометра и принимает решения на основе анализа спкектров). Я протестировал эту программу на своем компьютеретере: все нажатия просходят как надо, все хорошо. При сборке питон проекта в exe файл (через pyinstaller)тоже все работает хорошо - на моем персональном ноутбуке.
Но вот проблема:
Если запускать эти exe файлы на компьютере подключенном к спетрометру, то они не запускаются - windows XP не может выполнить эти файлы
Я вижу следующие пути решения:
Идея 1: Используя современный питон 3.12.4 на современном компьютере, упаковать мой проект в exe файл в режиме совместимости с XP. Протестировать также на современном ноутбуке но через винртуальную машину с XP. Возможно ли это?
Идея 2: снести с современного компа питон 3.12.4, установить на него последний питон из тех что совместимы с XP (это наверное 3.4?) и упаковать в exe. протестировать на виртуальной машине.
Идея 3: установить виртуальную машину с XP, на нее установить питон 3.4. и им же упаковать проект в exe.
Идея 4. Нарыть где нибуь в моем университете старый компьютер с XP но с доступом в интернет. Установить на него питон 3.4, упаковать проект в exe и протестировать.
В чем заключатеся мой вопрос:
Адекватны ли выше приведенные идеи или они обречены на провал? какая из них наиболее перспективная? может быть есть какой то совсем другой, очень простой путь?
Важное замечание: я не программист. Я устаовил питон, анаконду и VS code по инструкциям от чатгпт. Почти весь проект закодировали копайлот и чатгпт по моим запросам, а я только тестировал и подправлял немного. Слова “виртуальное окружение”, “интерпретатор” и т.д. мне не совсем понятны. Пожалуйста, если можно, имейте это ввиду, что я совсем новичок. Спасибо.
ниже приведу пример одной из функций, чтобы было понятно с чем я имею дело:
import sys
import os
import time
from pynput.keyboard import Controller as KeyboardController, Key
from pynput.mouse import Controller as MouseController, Button
from readConfig import readConfig
# Initialize the keyboard and mouse controllers
keyboard = KeyboardController()
mouse = MouseController()
def wireMoveTo(XYZ):
“”“Emulates mouse movements and keypresses to move to specified coordinates in Wire software.”“”
VpixelForX = readConfig(“VpixelForX:”)
VpixelForY = readConfig(“VpixelForY:”)
VpixelForZ = readConfig(“VpixelForZ:”)
HpixelForX = readConfig(“HpixelForX:”)
HpixelForY = readConfig(“HpixelForY:”)
HpixelForZ = readConfig(“HpixelForZ:”)
VpixelForGoTo = readConfig(“VpixelForGoTo:”)
HpixelForGoTo = readConfig(“HpixelForGoTo:”)
def enter_value(value):
“”“Deletes existing text and types a new value.”“”
for _ in range(5):
keyboard.press(Key.backspace)
keyboard.release(Key.backspace)
time.sleep(0.1)
keyboard.press(Key.delete)
keyboard.release(Key.delete)
time.sleep(0.1)
keyboard.type(str(value))
time.sleep(0.1)
def move_and_click(x, y):
“”“Moves mouse to a specific position and clicks.”“”
mouse.position = (x, y)
time.sleep(0.1)
mouse.click(Button.left, 1)
time.sleep(0.1)
print(f“Moving to position {XYZ} in Wire software…”)
for i in range(2):
# Enter X coordinate
print(f“Iteration {i+1}: Entering X coordinate…”)
move_and_click(HpixelForX, VpixelForX)
time.sleep(0.1)
enter_value(XYZ)
time.sleep(0.1)
time.sleep(0.1)
# Enter Y coordinate
print(f“Iteration {i+1}: Entering Y coordinate…”)
move_and_click(HpixelForY, VpixelForY)
time.sleep(0.1)
enter_value(XYZ)
time.sleep(0.1)
time.sleep(0.1)
# Enter Z coordinate
print(f“Iteration {i+1}: Entering Z coordinate…”)
move_and_click(HpixelForZ, VpixelForZ)
time.sleep(0.1)
enter_value(XYZ)
time.sleep(0.1)
time.sleep(0.1)
# Confirm the movement (simulating a click on ‘Go To’)
print(f“Iteration {i+1}: Executing move command…”)
move_and_click(HpixelForGoTo, VpixelForGoTo)
time.sleep(0.1)
time.sleep(0.1)
print(“Move command executed successfully.”)
if __name__ == ‘__main__’:
print('Start Testing of a function: wireMoveTo')
print('The key press emulation will start in 5 seconds. Please switch to the Wire application and do not touch anything.')
for i in range(5, 0, -1):
print(f'Starting in {i} seconds…')
time.sleep(1)
wireMoveTo()
print(“Finish Testing of a function: wireMoveTo”)
input(“Press Any Key to close.”)
В отедельном файле объявлен readconfig:
def readConfig(lineDescription):
configdata = “nothing”
with open(“config.txt”, “r”) as file:
for line in file:
if line.startswith(lineDescription):
configdata = int(line.strip())
break
return configdata
if __name__ == “__main__”:
# Example usage
lineDescription = “waterlineCPS785”
config_value = readConfig(lineDescription)
print(config_value)