Ответы пользователя по тегу Программирование
  • Почему QKeyEvent не работает без окна?

    @Andy_U
    Вот тут очевидная ошибка:

    if event.key() == Qt.Key_0 or Qt.Key_1:

    Должно быть так:

    if event.key() in [Qt.Key_0, Qt.Key_1]:

    Ну, или так:

    key = event.key()
    if key == Qt.Key_0 or key == Qt.Key_1:


    А с frame, по крайней мере, в том виде, как Вы написали, ничего работать не будеть, ведь этот класс не отнаследован от QmainWindow etc.
    Ответ написан
  • Как перешагнуть итерацию?

    @Andy_U
    Если Вы до начала входа в цикл, знаете, куда "прыгнуть" после первого шага, то можно так:

    for i in [0] + [j for j in range(6, len(array))]:
        print(array[i])


    Если же следующий индекс определяется после входа в цикл, читайте про итераторы и генераторы.
    Ответ написан
  • Как в python обратиться к переменной родительского класса?

    @Andy_U
    Не очень понял, зачем Вам это надо, но минимальные исправления ниже, причем варианты для Dialog1 и Dialog2 разные, без доп.информации не знаю, как лучше.

    class Main(object):  # основная функция
    
        def __init__(self):
            self.ab = AB()  # создаем экзмпляр класса с переменными
            d1 = Dialog1(self.ab)  # Создаем экзэмпляр класса который должен поменять переменную ab.a
            d2 = Dialog2(self)  # Создаем экзэмпляр класса который должен поменять переменную ab.b
    
        def sum(self):
            c = self.ab.a + self.ab.b
            print(c)
    
    
    class Dialog1(object):
        def __init__(self, parent):
            parent.a = 5  # !!! Пытаюсь поменять значение в переменной созданом в родительском классе Main
    
    
    class Dialog2(object):
        def __init__(self, parent):
            parent.ab.b = 6  # !!! Пытаюсь поменять значение в переменной созданом в родительском классе Main
    
    
    class AB(object):
        a = 1
        b = 2
    
    m = Main()
    
    print(m.ab.a)
    print(m.ab.b)
    Ответ написан
  • Возможен ли перехват вывода командной строки в реальном времени?

    @Andy_U
    Это решение намного красивее. Естественно, некоторая доработка напильником класса SubprocessProtocol потребуется. Я недавно проверял - работает, причем можно одновременно перехватывать и stdout, и stderr.

    P.S. На всякий случай - параметр data в pipe_data_received - это байты, поэтому его и нужно декодировать в utf-8 строку. Если под Windows и есть русские имена файлов - придется разобраться, какую кодировку использует rar. Скорее всего - cp866.
    Ответ написан
  • Задача про стену и кирпичи. Как решить?

    @Andy_U
    Ну, я бы начал с решения уравнения в целых положительных числах 3*x+4*y=25. Решений две штуки: (x=3, y=4) и (x=7, y=1). Т.е. у нас 2 класса рядов. Вариантов расположения кирпичей в первом классе 7!/(3!*4!)=35, во втором классе 8!/(7!*1!)=8. Итого 35+8=43 вариантов ряда. Генерируем их. Теперь заполняем матрицу размером 43*43, ставя единички там, где ряды кирпичей (один в столбце, второй в колонке) совместимы с условием отсутствия общей вертикальной щели (для каждого варианта ряда строим множество {L[1], L[1]+L[2], ... L1+...L[N-1]}, потом очевидно, что ряды "совместимы", если пересечение множеств пустое). Это все быстро и памяти немного надо. На питоне - 30 строк. Кстати, в построенной матрице нулей сильно больше, чем единиц. несколько рядов просто ни с одним другим не совместимы. А потом, увы, перебор, если я правильно понял условие задачи. Типа как в классической задаче "поставить 8 ферзей на шахматную доску, чтобы они не били друг друга".

    Update:

    Код на питоне 3.4.3, решающий задачу перебором (кроме получения "классов" рядов), приведен ниже:

    import itertools
    
    
    def build_tail(height, row):
        if height == 9:
            return neighbours_number[row]
        else:
            return sum(build_tail(height+1, i) for i in acceptable_neighbours[row])
    
    
    rows = {i for i in itertools.permutations([3, 3, 3, 4, 4, 4, 4], 7)} | \
           {i for i in itertools.permutations([3, 3, 3, 3, 3, 3, 3, 4], 8)}
    
    acc_rows = [set(itertools.accumulate(row[: -1])) for row in rows]
    acceptable_neighbours = [[i for i, b in enumerate(acc_rows) if not (a & b)] for a in acc_rows] # copied from @bobrovskyserg
    neighbours_number = [len(i) for i in acceptable_neighbours]
    
    print(sum(build_tail(1, i) for i in range(0, len(acc_rows))))


    Время решения ~40 секунд, ответ bobrovskyserg подтверждаю. Пошел разбираться с его алгоритмом...
    Ответ написан
  • Какие есть библиотеки на Python для работы с git?

    @Andy_U
    pygit2 - для самостоятельной (низкоуровневой) работы с репозиторием на файловом уровне
    Ответ написан