• Как заблокировать кнопку на время выполнения кода в PyQt5?

    sanya84
    @sanya84
    Фанатик Python 3
    import sys
    from io import BytesIO
    from time import sleep
    from PyQt5.QtWidgets import (QWidget, QProgressBar, QDialog,
        QPushButton, QApplication, QVBoxLayout, QLabel, QMessageBox)
    from PyQt5.QtCore import QTimer, QThread, pyqtSignal, Qt
    from PyQt5.QtGui import QPixmap, QImage
    import requests
    from PIL import Image
    from PIL.ImageQt import ImageQt
    
    
    # Отловить ошибки в слотах PyQt5
    def log_uncaught_exceptions(ex_cls, ex, tb):
        text = '{}: {}:\n'.format(ex_cls.__name__, ex)
        import traceback
        text += ''.join(traceback.format_tb(tb))
    
        print(text)
        QMessageBox.critical(None, 'Error', text)
        quit()
    sys.excepthook = log_uncaught_exceptions
    
    
    class ProgressWindow(QThread):
    	signal = pyqtSignal(int)
    	chunk_data = pyqtSignal(bytes)
    	url = "http://risovach.ru/upload/2014/02/mem/muzhik-bleat_43233947_orig_.jpg"
    	headers = {"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36"}
    
    	def __init__(self):
    		super().__init__()
    		self.window = QDialog()
    		self.window.setWindowTitle('Progress window')
    		self.progress = QProgressBar(self.window)
    		self.progress.setGeometry(0, 0, 240, 25)
    	def download_file(self, url):
    		with requests.get(url, headers=self.headers, stream=True) as response:
    			response.raise_for_status()
    			file_size = response.headers['content-length'] # 42689
    			print(file_size)
    			step = 0
    			for chunk in response.iter_content(chunk_size=426):
    				sleep(0.01)
    				step = step + 1
    				self.signal.emit(step)
    				self.chunk_data.emit(chunk)
    			self.signal.emit(0)
    
    	def run(self):
    		try:
    			self.download_file(self.url)
    		except Exception as error:
    			print(error)
    
    class MainWindow(QWidget):
    	def __init__(self):
    		super().__init__()
    		self.initUI()
    	def initUI(self):
    		self.setGeometry(300, 300, 500, 350)
    		self.setWindowTitle('Как научиться нормально программировать')
    		# self.setWindowModality(Qt.WindowModal)
    
    		vbox = QVBoxLayout(self)
    
    		self.start_button = QPushButton('Узнать', self)
    		self.start_button.move(40, 80)
    		self.start_button.clicked.connect(self.download)
    
    		self.label_image = QLabel(self)
    		vbox.addWidget(self.label_image)
    		vbox.addWidget(self.start_button)
    		self.setLayout(vbox)
    
    		self.progress_window = ProgressWindow()
    		self.progress_window.window.setModal(True)
    
    		self.buffer = BytesIO()
    		self.chunk_size = 0
    
    	def download(self):
    		self.progress_window.window.show()
    		self.progress_window.start()
    		self.start_button.setEnabled(False)
    		self.progress_window.signal.connect(self.update_progress)
    		self.progress_window.chunk_data.connect(self.image_view)
    
    	def update_progress(self, step):
    		if step >= 101:
    			self.progress_window.window.hide()
    			self.progress_window.terminate()
    			self.start_button.setEnabled(True)
    		else:
    			self.progress_window.progress.setValue(step)
    	def image_view(self, chunk):
    		self.buffer.write(chunk)
    		if len(chunk) <= 89:
    			pillow_image = Image.open(self.buffer)
    			pixmap = QPixmap(pillow_image.toqpixmap())
    			self.label_image.setPixmap(pixmap)
    			self.label_image.update()
    
    if __name__ == '__main__':
        application = QApplication(sys.argv)
        main_window = MainWindow()
        main_window.show()
        sys.exit(application.exec_())
    Ответ написан
    Комментировать
  • Почему никто не юзает map?

    sanya84
    @sanya84
    Фанатик Python 3
    Может потому что не всем нравятся "плюшки"?
    Ответ написан
    Комментировать
  • Повтор функции input раз?

    sanya84
    @sanya84
    Фанатик Python 3
    import random
    
    
    def get_data():
        count_number = int(input('Сколько чисел сгенерировать?: '))
        start_end = input('Введите диапозон через пробел: ').split(" ")
        start = int(start_end[0])
        end = int(start_end[1])
        return count_number, start, end
    
    def random_number_generator(start, end):
        random_number = random.randint(start, end)
        return random_number
    def write_numbers_to_list():
        result = []
    
        count, start, end = get_data()
        for i in range(count):
            result.append(random_number_generator(start, end))
        return "Сгенерированные числа: {0}".format(result)
    def print_result():
        rnd = write_numbers_to_list()
        print(rnd)
    
    def main():
        print_result()
    
    if __name__ == '__main__':
        main()
    Ответ написан
  • Можно ли проверить 2 текста в python на синонимы?

    sanya84
    @sanya84
    Фанатик Python 3
    import re
    
    
    def main():
        result_one = re.search(r'яблоко', input("Строка один: ")) #Красное яблоко
        result_two = re.search(r'груша', input("Строка два: "))   #Зелёная груша
        print(result_one)
        print(result_two)
    
        if result_one.group(0).lower() and result_two.group(0).lower() in ["яблоко", "груша"]:
            print("Строка один и строка два, содержат синонимы")
    
    if __name__ == '__main__':
        main()
    Ответ написан
  • Что не так с циклом For в Python?

    sanya84
    @sanya84
    Фанатик Python 3
    Вообще лучше так удалять дубли из списка
    def main():
        numbers = [1, 1, 2, 2, 3, 3, 4, 4, 5, 5]
        numbers = [number for number in set(numbers)]
        print(numbers)
    
    if __name__ == '__main__':
        main()
    Ответ написан
    6 комментариев
  • Есть ли пайтон библиотека распознавания речи с поддержкой формата ogg файлов?

    sanya84
    @sanya84
    Фанатик Python 3
    Потребуется ffmpeg установить из ffmpeg
    Распаковать и прописать в PATH
    from subprocess import Popen
    from speech_recognition import (Recognizer, AudioFile)
    from speech_recognition import (UnknownValueError, RequestError)
    
    
    class SpeechOggAudioFileToText:
        def __init__(self):
            self.recognizer = Recognizer()
    
        def ogg_to_wav(self, file):
            args = ['ffmpeg','-i', file, 'test.wav']
            process = Popen(args)
            process.wait()
        @property
        def text(self):
            AUDIO_FILE = 'test.wav'
            with AudioFile(AUDIO_FILE) as source:
                audio = self.recognizer.record(source)
            try:
                text = self.recognizer.recognize_google(audio, language='RU')
                return text
            except UnknownValueError:
                print("Не удаётся распознать аудио файл")
            except RequestError as error:
                print("Не удалось запросить результаты: {0}".format(error))
    
    def main():
        speech_ogg = SpeechOggAudioFileToText()
        speech_ogg.ogg_to_wav('test.ogg')
        print(speech_ogg.text)
    
    if __name__ == '__main__':
        main()
    Ответ написан
  • Def не воспринимает больше двух аргументов, в чем причина и как исправить (python kivy)?

    sanya84
    @sanya84
    Фанатик Python 3
    from kivy.app import App
    from kivy.uix.button import Button
    from kivy.uix.textinput import TextInput
    from kivy.uix.boxlayout import BoxLayout
    from kivy.uix.floatlayout import FloatLayout
    from kivy.uix.gridlayout import GridLayout
    from kivy.uix.label import Label
    from kivy.config import Config
    
    Config.set('graphics', 'width', '800')
    Config.set('graphics', 'height', '400')
    Config.set('graphics', 'resizable', '0')
    
    class ThoughtApp(App):
        def build (self):
            base=(BoxLayout(orientation='vertical'))
            fl=FloatLayout()
            adduser=(Label(text='Добавить участника:',
            pos=(-120,360),
            font_size=22,
            bold=True,
            font_name='C:\Windows\Fonts\calibril.ttf',
            size_hint=(.6,.1)))
            fl.add_widget(adduser)
            self.textinput=(TextInput(multiline=False,
            pos=(225,355),
            size_hint=(.5,.15),
            font_size=16))
            fl.add_widget(self.textinput)
            plusbtn=(Button(size_hint=(27/800,30/800),
            text='+',
            pos=(635,366.5),
            on_press=self.pluspress,
            background_color=[.55,.55,.55,1],
            background_normal=''))
            fl.add_widget(plusbtn)
            base.add_widget(fl)
            self.names_gl=GridLayout(rows=1,)
            base.add_widget(self.names_gl)
            return base
        def pluspress(self, event):
            self.names_gl.add_widget(Button(text=self.textinput.text,
            background_color=[.1,.9,.9,1],
            background_normal=''))
            self.textinput.text=''
    
    if __name__ == '__main__':
        ThoughtApp().run()
    Ответ написан
    4 комментария
  • Не работает переменная в Qt designer python3 с соксами?

    sanya84
    @sanya84
    Фанатик Python 3
    Вот код
    def log_uncaught_exceptions(ex_cls, ex, tb):
        text = '{}: {}:\n'.format(ex_cls.__name__, ex)
        import traceback
        text += ''.join(traceback.format_tb(tb))
    
        print(text)
        QtWidgets.QMessageBox.critical(None, 'Error', text)
        quit()
    
    sys.excepthook = log_uncaught_exceptions

    Дабавьте его в свой главный скрипт после всех импортов
    И да будет вам счастье
    Ответ написан
    Комментировать
  • Не работаєт код помогит исправить!Буду благодарен?

    sanya84
    @sanya84
    Фанатик Python 3
    import os
    import datetime
    import telebot
    from telebot import types
    
    
    bot = telebot.TeleBot('')
    
    
    class TestTeleBot:
        def __init__(self):
    
            self.bot_polling()
    
        @bot.message_handler(commands=['start'])
        def start_message(message):
            print('-------------------------------------------------------------------')
            print(datetime.datetime.fromtimestamp(message.date).strftime('%H:%M:%S %d-%m-%Y'))
            print(message.text)
            print(message.from_user.id)
            print(message.from_user.first_name)
            print(message.from_user.last_name)
            print(message.from_user.username)
            print('-------------------------------------------------------------------')
            bot.send_message(message.chat.id, "Здравствуте, что хотите заказать?")
    
            keyboard_menu = types.InlineKeyboardMarkup()
            pizza = types.InlineKeyboardButton(text="Пицца", callback_data="pizza")
            tea = types.InlineKeyboardButton(text="Чай", callback_data="tea")
            keyboard_menu.add(pizza, tea)
            bot.send_message(message.chat.id, 'Выбери в меню что тебе интересно', reply_markup=keyboard_menu)
    
        @bot.callback_query_handler(func=lambda call:True)
        def handler_item_menu(callback):
            print(callback.data)
            if callback.data == "pizza":
                keyboard_name = types.InlineKeyboardMarkup()
                #Пицца “Маргарита” (Margherita)
                margherita = types.InlineKeyboardButton(text="Маргарита", callback_data="margherita")
                #Пицца “Карбонара” (Carbonara)
                carbonara = types.InlineKeyboardButton(text="Карбонара", callback_data="carbonara")
                keyboard_name.add(margherita, carbonara)
                bot.send_message(callback.from_user.id, 'Какую?', reply_markup=keyboard_name)
            elif callback.data == "margherita":
                bot.send_message(callback.from_user.id, "Ваш заказ принят...")
            if callback.data == "tea":
                pass
    
        def bot_polling(self):
            return bot.polling(none_stop=True)
    
    def main():
        testTeleBot = TestTeleBot()
    if __name__ == '__main__':
        main()
    Ответ написан
  • Как записывать в переменные и выводить некоторый текст в PyQt5?

    sanya84
    @sanya84
    Фанатик Python 3
    import sys
    from PyQt5.QtWidgets import *
    
    
    def log_uncaught_exceptions(ex_cls, ex, tb):
        text = '{}: {}:\n'.format(ex_cls.__name__, ex)
        import traceback
        text += ''.join(traceback.format_tb(tb))
    
        print(text)
        QMessageBox.critical(None, 'Error', text)
        quit()
    
    sys.excepthook = log_uncaught_exceptions
    
    
    class MainWindow(QWidget):
        def __init__(self):
            super().__init__()
    
            self.setWindowTitle('Передача значения из QLineEdit в QListWidget')
            self.setGeometry(300, 300, 500, 400)
    
            vbox = QVBoxLayout(self)
    
            self.line_edit = QLineEdit()
            self.list_widget = QListWidget()
    
            self.button = QPushButton('Запустить')
            self.button.clicked.connect(self.add_item)
    
            vbox.addWidget(self.line_edit)
            vbox.addWidget(self.list_widget)
            vbox.addWidget(self.button)
    
        def add_item(self):
            self.list_widget.addItem(self.line_edit.text()) #QLineEdit метод метод text возвращает текст
                                                            # По QListWidget читайте документацию
            print(self.line_edit.text())
    
    if __name__ == "__main__":
        app = QApplication(sys.argv)
        main = MainWindow()
        main.show()
        sys.exit(app.exec_())
    Ответ написан
    Комментировать
  • Как отследить нажатие 1 раз?

    sanya84
    @sanya84
    Фанатик Python 3
    Опытным путём установил что что у меня реакция не как у Джет-а Ли) получается что пока кнопка нажата вызывается эта функция keyboard.is_pressed и с не очень маленькой скоростью поэтому у вас в файл и записывается много значений как вариант могу предложить следущий код с использованием задержки что бы вы успевали отпустить клавишу
    from time import sleep
    import pyautogui
    import keyboard
    
    ENTER = "enter"
    ESCAPE = "escape"
    
    def writing_data_file():
        if keyboard.is_pressed(ENTER):
            sleep(0.5)
            cursor_position = pyautogui.position()
            print(cursor_position)
            with open("cursor_position.txt", "a") as file:
                file.write("{0}\n".format(cursor_position))
        if keyboard.is_pressed(ESCAPE):
            quit()
    
    while True:
        writing_data_file()

    А так решений можно много найти, просто не совсем понятно с какой частотой вам нужна позиция курсора)
    И да как посоветовал Владимир Куц читайте документацию перед использованием библиотек
    А то я пока экспериментировал чуть HDD не форматнул))))
    Ответ написан
    Комментировать
  • Как мне из консоли удалить уже имеющийся текст на Python 3.8?

    sanya84
    @sanya84
    Фанатик Python 3
    Для очищения консоли можно использовать команду cls в Windows работает
    Думаю в Linux она тоже есть
    #Необходимые модули.
    import os
    from datetime import datetime #Модуль для определения времени.
    from time import sleep #Модуль для 'простойки'.
    
    #Все необходимые символы.
    digits = [
    [' ---- ','|    |','|    |','|    |','|    |','|    |',' ---- '], #Ноль.
    ['      ','     |','     |','     |','     |','     |','      '], #Один.
    [' ---- ','     |','     |',' ---- ','|     ','|     ',' ---- '], #Два.
    [' ---- ','     |','     |',' ---- ','     |','     |',' ---- '], #Три.
    ['      ','|    |','|    |',' ---- ','     |','     |','      '], #Четыре.
    [' ---- ','|     ','|     ',' ---- ','     |','     |',' ---- '], #Пять.
    [' ---- ','|     ','|     ',' ---- ','|    |','|    |',' ---- '], #Шесть.
    [' ---- ','     |','     |','     |','     |','     |','      '], #Семь.
    [' ---- ','|    |','|    |',' ---- ','|    |','|    |',' ---- '], #Восемь.
    [' ---- ','|    |','|    |',' ---- ','     |','     |',' ---- '], #Девять.
    ['      ','      ','  []  ','      ','  []  ','      ','      ']] #Точки (разделители).
    
    #Начинаем выводить символы в консоль.
    while True:
        now = list(str(datetime.now())[11:19:1]) #Здесь мы находим реальное вермя ЧЧ:ММ:CC.
        for i in range(7):
            #Вывод построчно больших цифр.
            print ('{0} {1}{6}{2} {3}{6}{4} {5}'.format(digits[int(now[0])][i], digits[int(now[1])][i], digits[int(now[3])][i],
            digits[int(now[4])][i], digits[int(now[6])][i], digits[int(now[7])][i],digits[10][i]))
        sleep(1) #Ждём секунду.
        os.system("cls")
    Ответ написан
    Комментировать
  • Как вывести график этой программы на PyQt5?

    sanya84
    @sanya84
    Фанатик Python 3
    Как сохранить изображение я разобрался а вот как отменить показ pyplot не смог)
    import sys
    from PyQt5.QtWidgets import QWidget, QLabel
    from PyQt5.QtGui import QPixmap
    from PyQt5.QtWidgets import QApplication
    
    
    import requests
    from bs4 import BeautifulSoup
    from nltk.tokenize import RegexpTokenizer
    import nltk
    import io
    nltk.download('stopwords')
    from nltk.corpus import stopwords
    import matplotlib.pyplot as pyplot
    from stop_words import get_stop_words
    
    r = requests.get('https://www.gutenberg.org/files/2701/2701-h/2701-h.htm')
    # Извлечение HTML
    html = r.text
    # Создаём BeautifulSoup из HTML
    soup = BeautifulSoup(html, "html5lib")
    
    # Получаем текст
    
    text = soup.get_text()
    # Создаём tokenizer, выкидывая знаки пунктуации
    tokenizer = RegexpTokenizer('\w+')
    
    # Создаём tokens
    tokens = tokenizer.tokenize(text)
    
    # Создаем новый list
    words = []
    
    # Перебираем список
    
    for word in tokens:
        words.append(word.lower())
    
    # Получаем английские стоп-слова и выводим некоторые из них
    sw = nltk.corpus.stopwords.words('english')
    with io.open("STOP_EN.txt", "r", encoding='utf-8') as myfile:
        data = myfile.read().splitlines()
    sw.extend(data)
    data2 = get_stop_words('en')
    sw.extend(data2)
    # Создаем новый list
    words_ns = []
    
    for word in words:
        if word not in sw:
            words_ns.append(word)
    
    # создаем график плотности ключевых слов
    fd = nltk.FreqDist(words_ns)
    total = fd.N()
    for wordo in fd:
        fd[wordo] /= float(total)/100
    
    fd.plot(25)
    pyplot.savefig("image.png")
    
    
    class ImageViewer(QWidget):
        def __init__(self):
            super().__init__()
    
            image_label = QLabel(self)
            pixmap = QPixmap("image.png")
            image_label.setPixmap(pixmap)
    
            self.resize(pixmap.width(), pixmap.height())  # fit window to the image
            self.setWindowTitle('График функции')
    
    
    def main():
        app = QApplication(sys.argv)
        image_viewer = ImageViewer()
        image_viewer.show()
        sys.exit(app.exec_())
    
    if __name__ == '__main__':
        main()
    Ответ написан
  • Как завершить поток, изменить значения для его работы и запустить снова?

    sanya84
    @sanya84
    Фанатик Python 3
    Вот так как вариант
    import sys
    from PySide2.QtCore import *
    from PySide2.QtGui import *
    from PySide2.QtWidgets import *
    import cv2 # OpenCV
    import qimage2ndarray # for a memory leak
    
    
    class ThreadCamera(QThread):
        status = True
        changePixmap = Signal(QImage)
    
        def __init__(self):
            super().__init__()
            self.capture = cv2.VideoCapture(0)
    
        def setStatus(self, status):
            self.status = status
        def captureRelease(self):
            self.capture.release()
    
        def run(self):
    
            while self.status:
                face_cascade = cv2.CascadeClassifier(r'haarcascade_frontalface_default.xml')
                ret, frame = self.capture.read()
                if (ret == True):
                    self.capture.set(3,640)
                    self.capture.set(4, 480)
                    frame = cv2.cvtColor (frame, cv2.COLOR_BGR2RGB)
                    gray = cv2.cvtColor (frame, cv2.COLOR_BGR2GRAY)
                    faces = face_cascade.detectMultiScale(gray, 1.3, 5)
                    for (x,y,w,h) in faces:
                        frame = cv2.rectangle(frame,(x,y),(x+w,y+h),(255,0,0),2)
                        roi_gray = gray[y:y+h, x:x+w]
                        roi_color = frame[y:y+h, x:x+w]
                    image = qimage2ndarray.array2qimage(frame)
                    self.changePixmap.emit(image)
    
    
    class ThreadVideoFile(QThread):
        status = True
        changePixmap = Signal(QImage)
    
        def __init__(self, path):
            super().__init__()
            self.capture = cv2.VideoCapture(path)
        def set_status(self, status):
            self.status = status
        def captureRelease(self):
            self.capture.release()
    
        def run(self):
    
            while self.status:
                face_cascade = cv2.CascadeClassifier(r'haarcascade_frontalface_default.xml')
                ret, frame = self.capture.read()
                if (ret == True):
                    self.capture.set(3,640)
                    self.capture.set(4, 480)
                    frame = cv2.cvtColor (frame, cv2.COLOR_BGR2RGB)
                    gray = cv2.cvtColor (frame, cv2.COLOR_BGR2GRAY)
                    faces = face_cascade.detectMultiScale(gray, 1.3, 5)
                    for (x,y,w,h) in faces:
                        frame = cv2.rectangle(frame,(x,y),(x+w,y+h),(255,0,0),2)
                        roi_gray = gray[y:y+h, x:x+w]
                        roi_color = frame[y:y+h, x:x+w]
                    image = qimage2ndarray.array2qimage(frame)
                    self.changePixmap.emit(image)
    
    
    
    class Dialog(QDialog):
        def __init__(self, parent):
            super().__init__()
            self.resize(400, 100)
            self.label = QLabel()
            self.label.setText("<center><h1>Выберите действие</h1></center>")
    
            self.button_open_camera = QPushButton('Камера')
            self.button_open_camera.clicked.connect(parent.open_camera)
            self.button_open_file = QPushButton('Видео файл')
            self.button_open_file.clicked.connect(parent.open_file)
    
            layout = QVBoxLayout()
            layout.addWidget(self.label)
            layout.addWidget(self.button_open_camera)
            layout.addWidget(self.button_open_file)
            self.setLayout(layout)
    
    
    
    class VideoWidget(QWidget):
    
        def __init__(self):
            super().__init__()
            self.initUI()
    
            self.thread_camera = ThreadCamera()
            self.thread_video = ThreadVideoFile("videoplayback.mp4")
    
    
    
        @Slot(QImage)
        def setImage (self, image):
            self.label.setPixmap(QPixmap.fromImage(image))
    
        def initUI(self):
            self.setFixedSize(640, 480)
            self.label = QLabel(self)
            self.label.setText("Загрузите видео")
            self.label.setAlignment(Qt.AlignCenter)
            self.label.installEventFilter(self)
            self.layout = QVBoxLayout(self)
            self.layout.setContentsMargins(0, 0, 0, 0)
            self.layout.addWidget(self.label)
            self.setLayout(self.layout)
    
    
        def eventFilter(self, obj, event):
            # Только фильтровать событие label, переписать его поведение,
            # другие события будут проигнорированы
            if obj == self.label:
                # здесь отфильтруйте событие mouse и перепишите его поведение
                if event.type() == QEvent.MouseButtonPress:
    
                    if event.buttons() == Qt.LeftButton:
                        self.dialog = Dialog(self)
                        self.dialog.exec_()
            return False
        def open_file(self):
            if self.thread_video.isRunning() is True:
                self.thread_video.set_status(False)
                self.thread_video.captureRelease()
    
            self.dialog.hide()
            self.thread_camera.setStatus(False)
            self.thread_camera.captureRelease()
    
            self.label.setText("Загрузите видео")
    
            fileDialog = QFileDialog(self)
            supportedMimeTypes = ["video", "*.*"]
            fileDialog.setMimeTypeFilters(supportedMimeTypes)
            moviesLocation = QStandardPaths.writableLocation(QStandardPaths.MoviesLocation)
            fileDialog.setDirectory(moviesLocation)
    
            if fileDialog.exec_() == QDialog.Accepted:
                self.file = fileDialog.selectedUrls()[0].toDisplayString()
                self.thread_video = ThreadVideoFile(self.file)
            self.thread_video.changePixmap.connect(self.setImage)
            self.thread_video.start()
    
    
        def open_camera(self):
            self.dialog.hide()
    
            self.thread_video.set_status(False)
            self.thread_video.captureRelease()
            self.label.setText("Загрузите видео")
    
            self.thread_camera = ThreadCamera()
            self.thread_camera.changePixmap.connect(self.setImage)
            self.thread_camera.start()
    
    
    def main():
        app = QApplication([])
        video_widget = VideoWidget()
        video_widget.show()
        sys.exit(app.exec_())
    
    if __name__ == '__main__':
        main()


    Дальше сами)
    Ответ написан
  • Как улучшить обработчик массива?

    sanya84
    @sanya84
    Фанатик Python 3
    Нуу если данные как есть то так)
    data = [
    ['Место', 'адрес', 'время', 'событие', 'время', 'событие'], \
    ['Место', 'адрес', 'время', 'событие', 'время', 'событие', 'событие'], \
    ['Место', 'адрес', 'время', 'событие', 'событие', 'время', 'событие'], \
    ['Место', 'адрес', 'время', 'событие', 'событие']
    ]
    
    my_dict = {'Место': 'Place', 'адрес': 'Address', 'время': 'Time', 'событие': 'Event'}
    
    def main():
        for i in range(len(data)):
            print("#следующий список...")
            for j in data[i]:
                print(my_dict[j], j)
    
    
    if __name__ == '__main__':
        main()
    Ответ написан
  • Module 'io' has no attribute 'BytesID' как исправить?

    sanya84
    @sanya84
    Фанатик Python 3
    Вот этого атрибута BytesID нет в модуле io есть BytesIO
    5eb08b6a10376058598708.png
    Ответ написан
    Комментировать
  • Как использовать метод C++ в коде на Python?

    sanya84
    @sanya84
    Фанатик Python 3
    Сам напросился БАТАН)
    С начала создаём заголовочный файл C++ (Да простят меня C++-шники:-))
    Person.hpp
    #ifndef PERSON_H
    #define PERSON_H
    
    #include <string>
    
    using namespace std;
    
    namespace person{
        class CppPerson{
            public:
                string name;
                int age;
                CppPerson();
                CppPerson(const string &name, const int &age);
                ~CppPerson();
                void setName(const string &name);
                string getName();
                int getAge();
        };
    }
    #endif

    Далее реализация
    Person.cpp
    #include <string>
    #include "Person.hpp"
    
    
    namespace person{
        CppPerson::CppPerson(){}
    
        CppPerson::CppPerson(const string &name, const int &age){
            this->name = name;
            this->age = age;
        }
        CppPerson::~CppPerson(){}
    
        void CppPerson::setName(const string &name){
            this->name = name;
        }
    
        string CppPerson::getName(){
            return name;
        }
    
        int  CppPerson::getAge(){
            return age;
        }
    }

    Далее в дело вступает как раз таки Cython
    person_module.pyx
    from libcpp.string cimport string
    
    cdef extern from "Person.hpp" namespace "person":
        cdef cppclass CppPerson:
            CppPerson(string name, int age) except +
            void setName(string name)
            string getName()
            int getAge()
    
    
    cdef class Person:
        cdef CppPerson *cpp_person
    
        def __cinit__(self, name, age):
            self.cpp_person = new CppPerson(name.encode(), age)
            if self.cpp_person == NULL:
                raise MemoryError('Not enough memory.')
    
        def __dealloc__(self):
            del self.cpp_person
        def setName(self, name):
            self.cpp_person.setName(name.encode())
        def getName(self):
            return self.cpp_person.getName().decode()
        def getAge(self):
            return self.cpp_person.getAge()

    Далее
    setup.py
    from distutils.core import setup, Extension
    from Cython.Build import cythonize
    
    setup(ext_modules = cythonize(Extension(
               "person_module",                                                 # the extesion name
               sources=["person_module.pyx", "Person.cpp"],     # the Cython source and
                                                                                           # additional C++ source files
               language="c++",                                                   # generate and compile C++ code
          )))

    Теперь нужно всё это чудо скормить Cython-у
    В той же папке где находятся все эти файлы запускаем cmd (Или с начала запускаем cmd а потом
    переходим в эту директорию)

    В cmd прописываем
    python setup.py build_ext --inplace
    Ну и тест
    test.py
    from person_module import Person
    
    def main():
        alexandr = Person("Александр", 35)
        print(alexandr.getName())
        print(alexandr.getAge())
    
    if __name__ == '__main__':
        main()

    Документация о Cython
    Ответ написан
    3 комментария
  • Вызов async функции через threading.Timer()?

    sanya84
    @sanya84
    Фанатик Python 3
    На сколько мне известно Timer позволяет запустить функцию через некоторое время
    Это вы можете сделать так
    # Python 3.7+
    import asyncio
    
    async def hello_world():
        await asyncio.sleep(3)
        print('Hello World!')
    
    asyncio.run(hello_world())


    Либо так

    from threading import Timer
    
    def hello_world():
        print('Hello World!')
    
    timer = Timer(3, hello_world)
    timer.start()
    timer.join()


    Вот так тогда
    # Python 3.7+
    import asyncio
    from threading import Timer
    
    async def hello_world():
        await asyncio.sleep(3)
        print('Hello World!')
    
    def wait():
        asyncio.run(hello_world())
    
    timer = Timer(3, wait)
    timer.start()
    timer.join()
    Ответ написан
    2 комментария
  • Как правильно наследоваться от двух классов?

    sanya84
    @sanya84 Автор вопроса
    Фанатик Python 3
    Я реализовал так, но это не совсем то что я хотел
    from tkinter import Tk, Button, mainloop
    from vlc import MediaPlayer
    
    URL = "https://str2.pcradio.ru/Eminem-med"
    
    
    class Player(Tk):
        def __init__(self):
            print("Инициализация Player")
            self.player = MediaPlayer()
            super().__init__()
    
            self.button = Button(self, text="Воспроизвести файл из интернета")
            self.button.configure(command=self.play)
            self.button.pack()
    
            self.protocol("WM_DELETE_WINDOW", self.on_closing)
    
        def play(self):
            return self.player.play()
        def set_mrl(self, mrl):
            return self.player.set_mrl(mrl)
    
        def on_closing(self):
            self.player.stop()
            del self.player
            self.destroy()
    
    
    class TkPlayer(Player):
        pass
    
    def main():
        tk_player = TkPlayer()
        tk_player.set_mrl(URL)
        tk_player.mainloop()
    
    if __name__ == '__main__':
        main()
    Ответ написан
  • При запуске код даёт ошибку. Python модуль pyttsx3/spech_recognition (?

    sanya84
    @sanya84
    Фанатик Python 3
    Может так?

    with m as sourse:
        r.adjust_for_ambient_noise(sourse)
        audio = r.listen(sourse)
    Ответ написан
    Комментировать