Библиотека для деталей БЧ

Автор Вират Лакх, 19.08.17, 07:32:57

« предыдущая - следующая »

0 Пользователей и 1 гость просматривают эту тему.

Умка

Кнопочки работают корректно все, кроме измерений. Прошу подсказки как это выполнить на КОМПАС V 13

Вират Лакх

Написали же раньше, вы предоставьте сообщения отладчика.

Умка

Это или я ошибся?
com_error: (-2147352571, '\xcd\xe5\xf1\xee\xe2\xef\xe0\xe4\xe5\xed\xe8\xe5 \xf2\xe8\xef\xee\xe2.', None, 1)

ТрындецЪ

25.09.17, 08:13:51 #123 Последнее редактирование: 25.09.17, 08:26:20 от ТрындецЪ
Цитата: Умка от 25.09.17, 07:20:21
Это или я ошибся?
com_error: (-2147352571, '\xcd\xe5\xf1\xee\xe2\xef\xe0\xe4\xe5\xed\xe8\xe5 \xf2\xe8\xef\xee\xe2.', None, 1)

Нужно сообщение целиком, там будет указана строчка в коде, где ошибка произошла.
Тут пишет "Несовпадение типов".

Цитата: Вират Лакх от 23.09.17, 21:06:53
window.after(1, lambda: window.focus_force())

Это тоже не даёт результата.

Умка

Traceback (most recent call last):
  File "C:\Program Files\Python26\lib\lib-tk\Tkinter.py", line 1410, in __call__
    return self.func(*args)
  File "C:\Program Files\ASCON\Á×_v0.7.2.pyw", line 987, in <lambda>
    but3 = tk.Button(frame, image = img, command = lambda event = None: Izmerit(event))
  File "C:\Program Files\ASCON\Á×_v0.7.2.pyw", line 755, in Izmerit
    application.MessageBoxEx( u"УкажиÑ,е грань, цилиндрическую поверÑ...носÑ,ÑŒ или ребро", u"Сообщение библиоÑ,еки", 64)
  File "C:\Program Files\Python26\lib\site-packages\win32com\gen_py\69AC2981-37C0-4379-84FD-5DD2F3C0A520x0x1x0.py", line 703, in MessageBoxEx
    , Caption, Flags)
com_error: (-2147352571, '\xcd\xe5\xf1\xee\xe2\xef\xe0\xe4\xe5\xed\xe8\xe5 \xf2\xe8\xef\xee\xe2.', None, 1)

Вират Лакх

Цитата: Вират Лакх от 23.09.17, 21:06:53
Попробовал print переменную написать в разных местах - отзывается компилировать...

Тут, оказывается, выравнивание в коде важно. Не следует писать в РАЗНЫХ местах :)
По копиям:
def Copy_program():
    """
    Ищет ранее запущенные свои копии
    """
    EnumWindows = ctypes.windll.user32.EnumWindows
    print EnumWindows
    EnumWindowsProc = ctypes.WINFUNCTYPE(ctypes.c_bool, ctypes.POINTER(ctypes.c_int), ctypes.POINTER(ctypes.c_int))
    print EnumWindowsProc
    GetWindowText = ctypes.windll.user32.GetWindowTextW
    print GetWindowText
    GetWindowTextLength = ctypes.windll.user32.GetWindowTextLengthW
    print GetWindowTextLength
    IsWindowVisible = ctypes.windll.user32.IsWindowVisible
    print IsWindowVisible
    def foreach_window(hwnd, lParam):
        print foreach_window
        print IsWindowVisible(hwnd)
        if IsWindowVisible(hwnd):
            length = GetWindowTextLength(hwnd)
            buff = ctypes.create_unicode_buffer(length + 1)
            GetWindowText(hwnd, buff, length + 1)
            print length
            print buff
            print hwnd
            if buff.value.find(u"Оформление детали БЧ") != -1:
                hwnd = win32gui.FindWindow(None, buff.value)
                hwnd = int(re.findall(r'\d+', str(hwnd))[0])
                win32gui.ShowWindow(hwnd, win32con.SW_RESTORE) # разворачивает окно
                sys.exit()
Выдает:
<_FuncPtr object at 0x000000000330B1E8>
<class 'ctypes.WinFunctionType'>
<_FuncPtr object at 0x000000000330B2B8>
<_FuncPtr object at 0x000000000330B388>
<_FuncPtr object at 0x000000000330B458>
<function foreach_window at 0x00000000036FA278>
0
Получается, первые 7 принтов выдает, а дальше IsWindowVisible(hwnd) фалит (= 0) и по if, соответственно, ничего не делает.

По фокусу: ХЗ.

Зачем в таких местах (см. ниже) писать "нажали""отпустили", когда хватает только "отпустили"?
Gabarit.bind("<ButtonRelease-2>", clear)
Gabarit.bind("<ButtonRelease-3>", activate_flash_menu)

ТрындецЪ

25.09.17, 09:49:25 #126 Последнее редактирование: 25.09.17, 10:04:13 от ТрындецЪ
Цитата: Умка от 25.09.17, 09:31:48
  File "C:\Program Files\ASCON\Á×_v0.7.2.pyw", line 755, in Izmerit
    application.MessageBoxEx( u"УкажиÑ,е грань, цилиндрическую поверÑ...носÑ,ÑŒ или ребро", u"Сообщение библиоÑ,еки", 64)

У Вас вообще всплывающие сообщения появляются?
Закомментируйте 755 строку (см. скрин.)

Цитата: Вират Лакх от 25.09.17, 09:34:33
Получается, первые 7 принтов выдает, а дальше IsWindowVisible(hwnd) фалит (= 0) и по if, соответственно, ничего не делает.

Попробуйте удалить это условие
if IsWindowVisible(hwnd):
или сделать его всегда истинным: if True:
ЦитироватьЗачем в таких местах (см. ниже) писать "нажали""отпустили", когда хватает только "отпустили"?

Потому что, можно нажать кнопку в одном поле, а отпустить в другом.

Умка

Всплывающих сообщений нет! Никаких.

ТрындецЪ

Цитата: Умка от 25.09.17, 09:54:53
Всплывающих сообщений нет! Никаких.

Видимо, они у Вас отключены в настройках (Сервис -- Параметры... -- Система -- Общие -- Всплывающие сообщения), отсюда все проблемы.

Вират Лакх

    def foreach_window(hwnd, lParam):
        print IsWindowVisible(hwnd)
        if True:
            length = GetWindowTextLength(hwnd)
            buff = ctypes.create_unicode_buffer(length + 1)
            GetWindowText(hwnd, buff, length + 1)
            print length
            print buff
            print hwnd
            print buff.value.find(u"Оформление детали БЧ")
            if buff.value.find(u"Оформление детали БЧ") != -1:
                hwnd = win32gui.FindWindow(None, buff.value)
                hwnd = int(re.findall(r'\d+', str(hwnd))[0])
                win32gui.ShowWindow(hwnd, win32con.SW_RESTORE) # разворачивает окно
                sys.exit()
Выдает:
0
0
<ctypes.c_wchar_Array_1 object at 0x0000000003390CC8>
<__main__.LP_c_long object at 0x0000000003390748>
-1

ТрындецЪ

Цитата: Вират Лакх от 25.09.17, 10:31:40
Выдает:
0
0
<ctypes.c_wchar_Array_1 object at 0x0000000003390CC8>
<__main__.LP_c_long object at 0x0000000003390748>
-1

Там функция есть EnumWindows(EnumWindowsProc(foreach_window), 0), которая перебирает все окна.
То что у Вас выдало, это для одного окна. Для других ничего не выдаёт?

Upd: Вообще, решение взято отсюда и немного переделано.

Вират Лакх

Её как писать? Так?
    EnumWindows(EnumWindowsProc(foreach_window), 0)
    print EnumWindows
    print EnumWindows(EnumWindowsProc(foreach_window), 0)
    print EnumWindowsProc(foreach_window)
Ответы:
<_FuncPtr object at 0x00000000033D01E8>
0
<WinFunctionType object at 0x00000000033D0528>

Умка

Сообщения в настройках не отключены, но нет всплывающих сообщений для Библиотеки для деталей БЧ.

ТрындецЪ

25.09.17, 11:40:09 #133 Последнее редактирование: 25.09.17, 11:59:17 от ТрындецЪ
Цитата: Умка от 25.09.17, 11:13:34
Сообщения в настройках не отключены, но нет всплывающих сообщений для Библиотеки для деталей БЧ.

Попробуйте вот эту версию.

Upd:
Цитата: Вират Лакх от 25.09.17, 10:54:39
Её как писать?

Попробуйте как на скрине. В отладчике должен список заголовков окон появиться.

Умка

Спасибо, измерения, всплывающие сообщения и прочие фишки выполняются корректно! Особо любо замеры длины прутка!

ТрындецЪ

25.09.17, 12:35:43 #135 Последнее редактирование: 25.09.17, 12:58:42 от ТрындецЪ
Цитата: Умка от 25.09.17, 12:32:43
Спасибо, измерения, всплывающие сообщения и прочие фишки выполняются корректно! Особо любо замеры длины прутка!

Вероятно, метода MessageBoxEx не было ещё в 13 версии.
Хотя, был метод. Ошибка в несоответствии типов всплывала... Я хз, короче)

Вират Лакх

    #if True:
            length = GetWindowTextLength(hwnd)
            buff = ctypes.create_unicode_buffer(length + 1)
            print buff
            GetWindowText(hwnd, buff, length + 1)
            print "Hello"
            print buff.value
            if buff.value.find(u"Оформление детали БЧ") != -1:
                hwnd = win32gui.FindWindow(None, buff.value)
                hwnd = int(re.findall(r'\d+', str(hwnd))[0])
                win32gui.ShowWindow(hwnd, win32con.SW_RESTORE) # разворачивает окно
                #sys.exit()
Ответ:
<ctypes.c_wchar_Array_1 object at 0x000000000325FCC8>
Hello

Буфф валуев пустой получается.

ТрындецЪ

Цитата: Вират Лакх от 25.09.17, 13:01:24
Буфф валуев пустой получается.

Я больше не знаю, чем помочь.

Вират Лакх

26.09.17, 08:33:04 #138 Последнее редактирование: 26.09.17, 09:36:44 от Вират Лакх
ТрындецЪ, вы из оригинала зря убрали return True
Сейчас такой код
    EnumWindows = ctypes.windll.user32.EnumWindows
    EnumWindowsProc = ctypes.WINFUNCTYPE(ctypes.c_bool, ctypes.POINTER(ctypes.c_int), ctypes.POINTER(ctypes.c_int))
    GetWindowText = ctypes.windll.user32.GetWindowTextW
    GetWindowTextLength = ctypes.windll.user32.GetWindowTextLengthW
    IsWindowVisible = ctypes.windll.user32.IsWindowVisible
    def foreach_window(hwnd, lParam):
        if IsWindowVisible(hwnd):
            length = GetWindowTextLength(hwnd)
            buff = ctypes.create_unicode_buffer(length + 1)
            GetWindowText(hwnd, buff, length + 1)
            print buff.value
            print buff.value.find(u"Оформление детали БЧ")
            if buff.value.find(u"Оформление детали БЧ") != -1:
               hwnd = win32gui.FindWindow(None, buff.value)
               print hwnd
               win32gui.ShowWindow(hwnd, win32con.SW_RESTORE) # разворачивает окно
               sys.exit()
        return True
    EnumWindows(EnumWindowsProc(foreach_window), 0)
выдает:
Пуск
-1

-1
Оформление детали БЧ v0.7.2
0
3083502
и работает, т.е. раскрывает ранее открытое из коммандера окно макроса. Но работает только если я запускаю "вторую копию" через IDLE (Python GUI). Если второе из коммандера запустить, то все равно копия получается, блин :( Приложил файл.
UPD:
Хорошо, что вы исходник дали. Я добавил titles = [] и print titles. Оно выдает типа того: [u'\u041f\u0443\u0441\u043a', u'', u'*Python Shell*', u'\u0411\u0427.pyw ... Т.е. русские буквы заменены их кодами. Я название окна заменил на root.title (u"VVV") - заработало без отладчика!  :j:
Как-то понимание русского языка можно включить? Если код вписать в название окна, то опять не работает.

ТрындецЪ

Цитата: Вират Лакх от 26.09.17, 08:33:04
ТрындецЪ, вы из оригинала зря убрали return True
Сейчас такой код
...
и работает, т.е. раскрывает ранее открытое из коммандера окно макроса. Но работает только если я запускаю "вторую копию" через IDLE (Python GUI). Если второе из коммандера запустить, то все равно копия получается, блин :(

Принты закомментируйте.