Задать вопрос
Профиль пользователя заблокирован сроком с 2 июля 2015 г. и навсегда по причине: Мат
Ответы пользователя по тегу Python
  • Как правильно сделать экранирование кавычек для exec() в python?

    bobrovskyserg
    @bobrovskyserg
    4 вида строковых делимитеров решают проблемы большинства питонистов.
    Но, видимо, есть исключения )))
    Ответ написан
  • Как решить ошибку в кортеже Python 2.7?

    bobrovskyserg
    @bobrovskyserg
    Десятичные целые НЕ имеют лидирующего нуля (кроме самого нуля, ессвенно)
    s = {
        'param': ( (1,9,2005), (u'other') )
        }
    Ответ написан
    Комментировать
  • Цифра в квадрате: что за символ и как обнаружить?

    bobrovskyserg
    @bobrovskyserg
    Python3
    print("8⃣9⃣2⃣2⃣6⃣1⃣2⃣6⃣9⃣9⃣6⃣".replace(chr(8419),''))
    Ответ написан
    6 комментариев
  • Почему выдается ошибка в pyQt5?

    bobrovskyserg
    @bobrovskyserg
    Поскольку "invalid syntax", у вас инвэлид синтакс.
    Поскольку вставить отформатированный код в вопрос вы не смогли, указать, где конкретно ошибка - затруднительно.
    Исправьте это.
    У меня ваш _отформатированый_ код работает (Ubuntu).
    Ответ написан
    Комментировать
  • Как сделать на tkinter аналог TChart (из Delphi)?

    bobrovskyserg
    @bobrovskyserg
    Нет.
    TChart - отрисованная в VCL графика,
    а tkinter - только обёртки виджетов гуи ОС.
    UPDATE
    from collections import OrderedDict
    import tkinter as tk
    from time import sleep
    
    class StripChart(tk.Frame):
        def __init__(self, parent, scale, historySize, trackColors, *args, **opts):
            # Initialize
            super().__init__(parent, *args, **opts)
            self._trackHist = OrderedDict()  # Map: TrackName -> list of canvas objID
            self._trackColor = trackColors  # Map: Track Name -> color
    
            self._chartHeight = scale + 1
            self._chartLength = historySize * 2  # Stretch for readability
    
            self._canvas = tk.Canvas(self, height=self._chartHeight + 17,
                                     width=self._chartLength, background='black')
            self._canvas.grid(sticky=tk.N + tk.S + tk.E + tk.W)
    
            # Draw horizontal to divide plot from tick labels
            x, y = 0, self._chartHeight + 2
            x2, y2 = self._chartLength, y
            self._baseLine = self._canvas.create_line(x, y, x2, y2, fill='white')
    
            # Init track def and histories lists
            self._trackColor.update({'tick': 'white', 'tickline': 'white',
                                     'ticklabel': 'white'})
            for trackName in self._trackColor.keys():
                self._trackHist[trackName] = [None for x in range(historySize)]
    
        def plotValues(self, **vals):
            for trackName, trackHistory in self._trackHist.items():
                # Scroll left-wards
                self._canvas.delete(trackHistory.pop(0))
                # Remove left-most canvas objs
                self._canvas.move(trackName, -2, 0)
                # Scroll canvas objs 2 pixels left
    
                # Plot the new values
                try:
                    val = vals[trackName]
                    x = self._chartLength
                    y = self._chartHeight - val
                    color = self._trackColor[trackName]
    
                    objId = self._canvas.create_line(x, y, x + 1, y, fill=color,
                                                     width=3, tags=trackName)
                    trackHistory.append(objId)
                except:
                    trackHistory.append(None)
    
        def drawTick(self, text=None, **lineOpts):
            # draw vertical tick line
            x = self._chartLength
            y = 1
            x2 = x
            y2 = self._chartHeight
            color = self._trackColor['tickline']
    
            objId = self._canvas.create_line(x, y, x2, y2, fill=color,
                                             tags='tick', **lineOpts)
            self._trackHist['tickline'].append(objId)
    
            # draw tick label
            if text is not None:
                x = self._chartLength
                y = self._chartHeight + 10
                color = self._trackColor['ticklabel']
    
                objId = self._canvas.create_text(x, y, text=text,
                                                 fill=color, tags='tick')
                self._trackHist['ticklabel'].append(objId)
    
        def configTrackColors(self, **trackColors):
            # Change plotted data color
            for trackName, colorName in trackColors.items():
                self._canvas.itemconfigure(trackName, fill=colorName)
    
            # Change settings so future data has the new color
            self._trackColor.update(trackColors)
    
    
    if __name__ == '__main__':
        top = tk.Tk()
        graph = StripChart(top, 100, 300, {'A': 'blue', 'B': 'green', 'C': 'red'})
        graph.grid()
    
        val_A = val_B = val_C = 0
        delta = [-3, -2, -1, 0, 1, 2, 3]  # randomly vary the values by one of these
        tickCount = 0
    
        def nextVal(current, lowerBound, upperBound):
            from random import choice
    
            current += choice(delta)
            if current < lowerBound:
                return lowerBound
            elif current > upperBound:
                return upperBound
            else:
                return current
    
        def plotNextVals():
            global val_A, val_B, val_C, tickCount
    
            if tickCount % 50 == 0:
                graph.drawTick(text=str(tickCount), dash=(1, 4))
            tickCount += 1
            sleep(0.05)
    
    
            val_A = nextVal(val_A, 0, 99)
            val_B = nextVal(val_B, 0, 99)
            val_C = nextVal(val_C, 0, 99)
            graph.plotValues(A=val_A, B=val_B, C=val_C)
    
            # changeColor = { 800: 'black',
            # 1200: 'yellow',
            # 1600: 'orange',
            # 2000: 'white',
            # 2400: 'brown',
            # 2800: 'blue' }
            # if tickCount in changeColor:
            # graph.configTrackColors( A=changeColor[tickCount] )
    
            top.after(1, plotNextVals)
    
        top.after(1, plotNextVals)
    
        top.mainloop()
    Ответ написан
    3 комментария
  • Как сделать многостраничную форму со вкладками?

    bobrovskyserg
    @bobrovskyserg
    from tkinter import *
    import tkinter.ttk as ttk
    
    root = Tk()
    root.title('test')
    
    nb = ttk.Notebook(root)
    nb.pack(fill='both', expand='yes')
    
    f1 = Text(root)
    f2 = Text(root)
    f3 = Text(root)
    
    nb.add(f1, text='page1')
    nb.add(f2, text='page2')
    nb.add(f3, text='page3')
    
    root.mainloop()
    Ответ написан
    Комментировать
  • Как реализовать взаимодействие gui и программы, на примере PyQt и python?

    bobrovskyserg
    @bobrovskyserg
    Лови тетрис под Python3
    import sys
    from random import randint
    from PyQt4 import QtCore, QtGui
    
    
    class Tetris(QtGui.QMainWindow):
        def __init__(self):
            super(Tetris, self).__init__()
            self.tboard = Board(self)
            self.setCentralWidget(self.tboard)
            self.statusbar = self.statusBar()
            self.tboard.msg2Statusbar[str].connect(self.statusbar.showMessage)
            self.tboard.start()
            self.resize(180, 380)
            self.center()
            self.setWindowTitle('Tetris')
            self.show()
    
        def center(self):
            screen = QtGui.QDesktopWidget().screenGeometry()
            size = self.geometry()
            self.move((screen.width() - size.width()) // 2, (screen.height() - size.height()) // 2)
    
    
    class Board(QtGui.QFrame):
        msg2Statusbar = QtCore.pyqtSignal(str)
        BoardWidth, BoardHeight, Speed = 10, 22, 300
        EmptyLine = [0] * BoardWidth
        geometry = (None,
                    (((0, 0), (-1, -1), (0, -1), (-1, -2)), ((-1, 0), (0, 0), (0, -1), (1, -1)),
                     ((0, 0), (-1, -1), (0, -1), (-1, -2)), ((-1, 0), (0, 0), (0, -1), (1, -1))),
                    (((-1, 0), (-1, -1), (0, -1), (0, -2)), ((0, 0), (1, 0), (-1, -1), (0, -1)),
                     ((-1, 0), (-1, -1), (0, -1), (0, -2)), ((0, 0), (1, 0), (-1, -1), (0, -1))),
                    (((0, 0), (0, -1), (0, -2), (0, -3)), ((-2, -1), (-1, -1), (0, -1), (1, -1)),
                     ((0, 0), (0, -1), (0, -2), (0, -3)), ((-2, -1), (-1, -1), (0, -1), (1, -1))),
                    (((-1, 0), (0, 0), (1, 0), (0, -1)), ((1, 0), (0, -1), (1, -1), (1, -2)),
                     ((0, 0), (-1, -1), (0, -1), (1, -1)), ((-1, 0), (-1, -1), (0, -1), (-1, -2))),
                    (((-1, 0), (0, 0), (-1, -1), (0, -1)), ((-1, 0), (0, 0), (-1, -1), (0, -1)),
                     ((-1, 0), (0, 0), (-1, -1), (0, -1)), ((-1, 0), (0, 0), (-1, -1), (0, -1))),
                    (((0, 0), (1, 0), (0, -1), (0, -2)), ((-1, 0), (0, 0), (1, 0), (1, -1)),
                     ((0, 0), (0, -1), (-1, -2), (0, -2)), ((-1, 0), (-1, -1), (0, -1), (1, -1))),
                    (((-1, 0), (0, 0), (0, -1), (0, -2)), ((1, 0), (-1, -1), (0, -1), (1, -1)),
                     ((0, 0), (0, -1), (0, -2), (1, -2)), ((-1, 0), (0, 0), (1, 0), (-1, -1))))
    
        def __init__(self, parent):
            super(Board, self).__init__(parent)
            self.timer = QtCore.QBasicTimer()
            self.isWaitingAfterLine = self.isStarted = self.isPaused = False
            self.numLinesRemoved = 0
            self.setFocusPolicy(QtCore.Qt.StrongFocus)
    
        def start(self):
            if self.isPaused:
                return
            self.isStarted = True
            self.isWaitingAfterLine = False
            self.numLinesRemoved = 0
            self.board = [Board.EmptyLine.copy() for _ in range(Board.BoardHeight)]
            self.msg2Statusbar.emit(str(self.numLinesRemoved))
            self.newPiece()
            self.timer.start(Board.Speed, self)
    
        def paintEvent(self, event):
            glass = [l.copy() for l in self.board]
            if self.shape:
                s, a, X, Y = self.shape
                for x, y in self.geometry[s][a]:
                    glass[y + Y][x + X] = s
            h, w = self.contentsRect().height() // Board.BoardHeight, self.contentsRect().width() // Board.BoardWidth
            painter = QtGui.QPainter(self)
            for y, l in enumerate(glass):
                y = self.contentsRect().bottom() - (y + 1) * h
                for x, s in enumerate(l):
                    if s:
                        x *= w
                        color = QtGui.QColor(
                            (None, 0xCC6666, 0x66CC66, 0x6666CC, 0xCCCC66, 0xCC66CC, 0x66CCCC, 0xDAAA00)[s])
                        painter.fillRect(x + 1, y + 1, w - 2, h - 2, color)
                        painter.setPen(color.light())
                        painter.drawLine(x, y + h - 1, x, y)
                        painter.drawLine(x, y, x + w - 1, y)
                        painter.setPen(color.dark())
                        painter.drawLine(x + 1, y + h - 1, x + w - 1, y + h - 1)
                        painter.drawLine(x + w - 1, y + h - 1, x + w - 1, y + 1)
    
    
        def keyPressEvent(self, event):
            if not (self.isStarted and self.shape):
                super(Board, self).keyPressEvent(event)
                return
            key = event.key()
            if key == QtCore.Qt.Key_P:
                self.isPaused ^= True
                if self.isPaused:
                    self.timer.stop()
                    self.msg2Statusbar.emit('paused')
                else:
                    self.timer.start(Board.Speed, self)
                    self.msg2Statusbar.emit(str(self.numLinesRemoved))
            elif key == QtCore.Qt.Key_Left:
                self.nextshape[2] -= 1
                self.tryMove()
            elif key == QtCore.Qt.Key_Right:
                self.nextshape[2] += 1
                self.tryMove()
            elif key == QtCore.Qt.Key_Down:
                self.nextshape[1] = (self.shape[1] + 1) % 4
                self.tryMove()
            elif key == QtCore.Qt.Key_Up:
                self.nextshape[1] = (self.shape[1] + 3) % 4
                self.tryMove()
            elif key == QtCore.Qt.Key_Space:
                self.dropDown()
            elif key == QtCore.Qt.Key_D:
                self.oneLineDown()
            else:
                super(Board, self).keyPressEvent(event)
    
        def timerEvent(self, event):
            if event.timerId() == self.timer.timerId():
                if self.isWaitingAfterLine:
                    self.isWaitingAfterLine = False
                    self.newPiece()
                else:
                    self.oneLineDown()
            else:
                super(Board, self).timerEvent(event)
    
        def dropDown(self):
            while self.tryMove():
                self.nextshape[3] -= 1
            self.pieceDropped()
    
        def oneLineDown(self):
            self.nextshape[3] -= 1
            if not self.tryMove():
                self.pieceDropped()
    
        def pieceDropped(self):
            s, a, X, Y = self.shape
            for x, y in self.geometry[s][a]:
                self.board[y + Y][x + X] = s
            self.board = [l for l in self.board if not all(l)]
            numFullLines = Board.BoardHeight - len(self.board)
            if numFullLines:
                for i in range(numFullLines):
                    self.board.append(Board.EmptyLine.copy())
                self.numLinesRemoved += numFullLines
                self.msg2Statusbar.emit(str(self.numLinesRemoved))
                self.isWaitingAfterLine = True
                self.shape = None
                self.update()
            if not self.isWaitingAfterLine:
                self.newPiece()
    
        def newPiece(self):
            self.nextshape = [randint(1, 7), 0, Board.BoardWidth // 2, Board.BoardHeight - 1]
            if not self.tryMove():
                self.shape = None
                self.timer.stop()
                self.isStarted = False
                self.msg2Statusbar.emit("Game over")
    
        def tryMove(self):
            s, a, X, Y = self.nextshape
            for x, y in self.geometry[s][a]:
                x += X
                y += Y
                if not (0 <= x < Board.BoardWidth and 0 <= y) or self.board[y][x]:
                    self.nextshape = self.shape.copy()
                    return False
            self.shape = self.nextshape.copy()
            self.update()
            return True
    
    
    if __name__ == '__main__':
        app = QtGui.QApplication([])
        tetris = Tetris()
        sys.exit(app.exec_())
    Ответ написан
  • Почему нельзя делать ^Z в конце строки?

    bobrovskyserg
    @bobrovskyserg
    Потому что это - обертка над виндовой функцией ввода.
    Исправить можно, пропатчив винду.
    Ответ написан
    Комментировать
  • Практическое применение f((yield x))?

    bobrovskyserg
    @bobrovskyserg
    Ну и чудище. Похоже на косяк Guido.
    "there is no reason to do it this way".

    UPDATE
    так чуть длиннее, но не вызывает у меня отвращения:
    >>> from itertools import chain
    >>> def f(val):
    ...     return "Hi"
    ... 
    >>> list(chain.from_iterable((a, f(a)) for a in [1, 2, 3]))
    [1, 'Hi', 2, 'Hi', 3, 'Hi']
    Ответ написан
    Комментировать
  • Как искать файлы определенного типа?

    bobrovskyserg
    @bobrovskyserg
    from os import walk, path
    
    l = []
    for pth, dir, files in walk("/home/me/music"):
        for f in files:
            if f.lower().endswith('.mp3'):
                l.append(path.join(pth, f))
    Ответ написан
    Комментировать
  • Формирование вложенных в список списков из других списков по определенным правилам?

    bobrovskyserg
    @bobrovskyserg
    allIndex_A = [1, 2, 8, 12, 17, 21, 23, 29]
    allIndex_B = [3, 5, 7, 9, 11, 13, 15, 18, 20, 22, 24, 26, 28, 30]
    allIndex_C = [4, 6, 10, 14, 16, 19, 25, 27]
    
    ita, itb, itc = iter(allIndex_A), iter(allIndex_B), iter(allIndex_C)
    b = c = allIndex_A[0]
    newList = []
    try:
        while True:
            a = next(ita)
            while b <= a:
                b = next(itb)
            while c <= a:
                c = next(itc)
            newList.append([a, b, c])
    except StopIteration:
        print(newList)
    Ответ написан
    Комментировать
  • Что с кодировкой?

    bobrovskyserg
    @bobrovskyserg
    self.button = QtGui.QPushButton(u' поиск ',self) - всё в порядке, стало быть, перед
    self.listBox.addItem(f) надо приводить f к юникоду.
    Ответ написан
  • Как уменьшить функцию?

    bobrovskyserg
    @bobrovskyserg
    WTF return pass?

    А так-то - почему нет?
    def f(**kwargs):
        print(kwargs)
        kwargs['a'] = 2
        kwargs['b'] = 3
        print(kwargs)
    
    f(a=1)
    Ответ написан
    1 комментарий
  • Как повысить эффективность кода? Или такое поведение программы считается нормальным?

    bobrovskyserg
    @bobrovskyserg
    1. Это поведение - норма.
    Попробуй заменить
    var = random.choice(monetka)
    на
    var = 'орел'
    и ты увидишь, на что уходит время.

    2. Код не выглядит профессионально, но поскольку "продолжаю учиться программированию", забей на выливающийся тут неадекват.

    Удачи.

    UPDATE
    import random
    
    coin = ('head', 'tail') 
    heads = tails = count = 0
    
    while True:
        while True:
            try:
                times = int(input('Amount of coin toss?: '))
                break
            except ValueError:
                print('Must be integer')
    
        for i in range(times):  # +скорость +однозначность
            var = random.choice(coin)
            count += 1
            if var == 'head':  # +наглядность +скорость
                heads += 1
            else:
                tails += 1
    
        print('Current results: head count = {0} ({1:%}), tail count = '
              '{2} ({3:%})'.format(heads, heads / count, tails, tails / count))
    
        while True:
            new = input('Continue? y/n: ')
            if new in ('y', 'n'):
                break
            else:
                print('Print "y" or "n"')
    
        if new == 'n':
            break
    
    print('Final results: head count = {0} ({1:%}), tail count = '
          '{2} ({3:%})'.format(heads, heads / count, tails, tails / count))
    Ответ написан
    Комментировать
  • Как объявить две структуры с полями типа друг друга?

    bobrovskyserg
    @bobrovskyserg
    Используйте атрибут инстанса, а не класса.
    Или так:
    class modbus_backend_t(Structure):
        pass
    
    class modbus_t(Structure):
        _fields_ = [
            ...
            ("backend", POINTER(modbus_backend_t)),
        ]
    
    class modbus_backend_t(Structure):
        _fields_ = [
            ...
            ("mb", modbus_t),
         ]
    Ответ написан
    Комментировать
  • Почему возникают неточности при работе с большими числами в Python 3.4.2?

    bobrovskyserg
    @bobrovskyserg
    Используйте целочисленное деление:
    print(factorial(2 * N) // (factorial(N) * factorial(N + 1)))
    Ответ написан
    Комментировать
  • Как ускорить регулярные выражения в python?

    bobrovskyserg
    @bobrovskyserg
    Регулярные выражения предварительно откомпилированы?
    Если нет - сделайте это.
    Если да - десятикратного выигрыша при переходе на C++ не будет, и не надейтесь.
    Питоновский движок re написан на C и сопоставим по быстродействию с реализациями в библиотеках других языков.
    Так что:
    1. Препроцессинг html - наверняка можно отсечь ненужные куски и выкусить ненужные блоки, прежде чем натравливать на него 3000 паттернов
    2. Еще более глубокий препроцессинг - разбиение html на атомарные фрагменты с тем, чтобы, единожды идентифицировав фрагмент, больше по нему не елозить.
    Ответ написан
    2 комментария
  • Интересует соотношение задач программы к её объёму. Возможно как-то оптимизировать код?

    bobrovskyserg
    @bobrovskyserg
    Явных ошибок не вижу, рабочий код. Разве что "except TypeError" лишено смысла.
    По мелочам:
    while life > 0 and count == 0:
    не следует сравнивать с нулём: все встроенные типы могут возвращать логическое значение, будучи об этом спрошены условным оператором :)
    Например:
    if not []:
       print('[] вернул False')
    if [1, 2, 3]:
       print('[1, 2, 3] вернул True')

    Для чисел - 0 возвращает False

    Ну и основной цикл я бы подужал :)
    ......
                else:
                    i = random.randint(1, 5)
                    ch, y = random.choice((('+', x + i), ('-', x - i), ('*', x * i), ('/', x / i)))
                    print('Случайная величина = ', i)
                    print('Результат действия = ', y)
                    if input('Что это было за действие?: ') == ch:
                        print(yes)
                        count += 1
                    else:
                        print(no)
                        life -= 1
                        print('Прав на ошибку - ', life)
                if count == 10:
    ......
    Ответ написан
    1 комментарий
  • На каком языке пишутся драйвера?

    bobrovskyserg
    @bobrovskyserg
    Драйвера пишутся на компилируемых языках, поддерживающих бинарные интерфейсы соостветствующих ОС. Это C, C++, assembler, кое-где psacal.
    Python этим требованиям не соответствует.

    Встречный вопрос: драйвером какого устройства хотите нас порадовать?
    Ответ написан
    Комментировать