Уведомления

Группа в Telegram: присоединиться
  • Начало
  • » GUI
  • » QSpinBox Qt5 передача значения в питон [RSS Feed]

#1 Июль 12, 2018 16:07:51

Venus
Зарегистрирован: 2017-05-19
Сообщения: 55
Репутация: +  0  -
Профиль   Отправить e-mail  

QSpinBox Qt5 передача значения в питон

PEHDOM
вставил ваш пример пишет AttributeError: module ‘PyQt5.QtGui’ has no attribute ‘QWidget’
мой код mainа

import sys
from samplestrorint import *
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QMessageBox, QSpinBox
import strorint1

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(QtWidgets.QMainWindow):
def __init__(self, parent=None):
QtWidgets.QWidget.__init__(self, parent)
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
self.statusBar().showMessage('Stop')
self.ui.pushButton.clicked.connect(self.Start)
self.ui.pushButton_2.clicked.connect(self.Stop)
self.ui.pushButton.clicked.connect(lambda: self.statusBar().showMessage('запущен'))
self.ui.pushButton_2.clicked.connect(lambda: self.statusBar().showMessage('остановлен'))

self.layout = QtGui.QGridLayout(self)
# r
self.r_label = QtGui.QLabel(self, text = 'r:')
self.r = QtGui.QSpinBox(self) # Создаем спинбокс
self.r.setObjectName('r') # Устанавлваем имя виджета, чтобы понимать кто отправитель события
self.r.setRange(1, 10)
self.r.setSingleStep(1)
self.layout.addWidget(self.r_label, 0, 0)
self.layout.addWidget(self.r, 0, 1)

def get_r(self):
# возвращает r
return self.r.value()
def get_t(self):
# возвращает t
return self.t.value()
def get_all(self):
# возвращает два значения первое r второе t
return self.r.value(), self.t.value()
def get_list_values(self):
# возвращает кортеж значений, первое r второе t
return (self.r.value(), self.t.value())
def get_dict_values(self):
# возвращает значения в виде словаря
return {'r':self.r.value(), 't':self.t.value()}
def r_changed(self, value):
# должно отработать когда меняют значение r
print('это метод r_changed, r=', value)
def t_changed(self, value):
# должно отработать когда меняют значение t
print('это метод t_changed, t=', value)
def changed(self, value):
# один слот к которому цепляються все спнбоксы, отрабатывает когда меняем значение любого спнбокса
sender_name = self.sender().objectName()
print('это метод changed, спинбокс ', sender_name, 'сменил значение', value)

def Start(self):

pass


def Stop(self):
pass


if __name__=="__main__":
app = QtWidgets.QApplication(sys.argv)
myapp = MainWindow()
myapp.show()
sys.exit(app.exec_())
r = myapp.get_r()
t = myapp.get_t()
print('значения пооnдельности: r=', r, 't= ', t)
r,t = myapp.get_all()
print('значения вместе: r=', r, 't= ', t)
lst = myapp.get_list_values()
print('значения кортежем:', lst)
dct = myapp.get_dict_values()
print('значения словарем:', dct)[code python]

Отредактировано Venus (Июль 12, 2018 16:08:49)

Офлайн

#2 Июль 12, 2018 16:22:31

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 900
Репутация: +  160  -
Профиль   Отправить e-mail  

QSpinBox Qt5 передача значения в питон

> вставил ваш пример пишет AttributeError: module ‘PyQt5.QtGui’ has no attribute ‘QWidget’
да у вас пятый куте, в нем виждеты перенесли в другой модуль, земените from “PyQt4 import QtGui” на “from PyQt5 import QtWidgets as QtGui” и все должно заработать, и посмотрите что выходит.

Отредактировано PEHDOM (Июль 12, 2018 16:24:52)

Офлайн

#3 Июль 13, 2018 15:07:27

Venus
Зарегистрирован: 2017-05-19
Сообщения: 55
Репутация: +  0  -
Профиль   Отправить e-mail  

QSpinBox Qt5 передача значения в питон

PEHDOM
> вставил ваш пример пишет AttributeError: module ‘PyQt5.QtGui’ has no attribute ‘QWidget’да у вас пятый куте, в нем виждеты перенесли в другой модуль, земените from “PyQt4 import QtGui” на “from PyQt5 import QtWidgets as QtGui” и все должно заработать, и посмотрите что выходит.
терь это вывел - AttributeError: module ‘PyQt5.QtGui’ has no attribute ‘QGridLayout’

Офлайн

#4 Июль 13, 2018 15:14:29

Venus
Зарегистрирован: 2017-05-19
Сообщения: 55
Репутация: +  0  -
Профиль   Отправить e-mail  

QSpinBox Qt5 передача значения в питон

можешь подсказать почему по нажатию кнопки старт на виджете, внешний скрипт и функция запускается но виджет виснет, если не закрыват то видно как скрипт продолжает работать(выводит там чтото)) ) закроешь и усё?

Офлайн

#5 Июль 13, 2018 15:41:12

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 900
Репутация: +  160  -
Профиль   Отправить e-mail  

QSpinBox Qt5 передача значения в питон

Venus
терь это вывел - AttributeError: module ‘PyQt5.QtGui’ has no attribute ‘QGridLayout’
все работает, проверял на куте5
 #
import sys
from PyQt5 import QtWidgets as QtGui
class MainWindow(QtGui.QWidget):
    def __init__(self, parent = None):
        super().__init__(parent = parent)
        self.layout = QtGui.QGridLayout(self)
        # r
        self.r_label = QtGui.QLabel(self, text = 'r:')
        self.r = QtGui.QSpinBox(self) # Создаем спинбокс
        self.r.setObjectName('r') # Устанавлваем имя виджета, чтобы понимать кто отправитель события
        self.r.setRange(1, 10)
        self.r.setSingleStep(1)
        self.layout.addWidget(self.r_label, 0, 0)
        self.layout.addWidget(self.r, 0, 1)
        # t
        self.t_label = QtGui.QLabel(self, text = 't:')
        self.t = QtGui.QSpinBox(self) # Создаем спинбокс
        self.t.setObjectName('t') # Устанавлваем имя виджета, чтобы понимать кто отправитель события
        self.t.setRange(1, 10)
        self.t.setSingleStep(1)
        self.layout.addWidget(self.t_label, 1, 0)
        self.layout.addWidget(self.t, 1, 1)
        self.t.installEventFilter(self)
        self.r.valueChanged.connect(self.r_changed) # соединяем каждый спинбокс с своим слотом
        self.t.valueChanged.connect(self.t_changed) # соединяем каждый спинбокс с своим слотом
        self.r.valueChanged.connect(self.changed) # соединяем все спинбоксы с одним слотом
        self.t.valueChanged.connect(self.changed) # соединяем все спинбоксы с одним слотом
        self.show()
    def get_r(self):
        # возвращает r
        return self.r.value()
    def get_t(self):
        # возвращает t
        return self.t.value()
    def get_all(self):
        # возвращает два значения первое r второе t
        return self.r.value(), self.t.value()
    def get_list_values(self):
        # возвращает кортеж значений, первое r второе t
        return (self.r.value(), self.t.value())
    def get_dict_values(self):
        # возвращает значения в виде словаря
        return {'r':self.r.value(), 't':self.t.value()}
    def r_changed(self, value):
        # должно отработать когда меняют значение r
        print('это метод r_changed, r=', value)
    def t_changed(self, value):
        # должно отработать когда меняют значение t
        print('это метод t_changed, t=', value)
    def changed(self, value):
        # один слот к которому цепляються все спнбоксы, отрабатывает когда меняем значение любого спнбокса
        sender_name = self.sender().objectName()
        print('это метод changed, спинбокс ', sender_name, 'сменил значение', value)
if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    mw = MainWindow()
    print('запуск GUI (главный обработчик событий QT) , выполнение скрипта приостановлено')
    app.exec_() # Вот тут скрипт остановиться пока вы не выйдете из GUI
    print('GUI закрыто, продолжаем выполнение срипта...')
    r = mw.get_r()
    t = mw.get_t()
    print('значения пооnдельности: r=', r, 't= ', t)
    r,t = mw.get_all()
    print('значения вместе:  r=', r, 't= ', t)
    lst = mw.get_list_values()
    print('значения кортежем:', lst)
    dct = mw.get_dict_values()
    print('значения словарем:', dct)
    #mw.show()
    #app.exec_()

Отредактировано PEHDOM (Июль 13, 2018 16:05:21)

Офлайн

#6 Июль 13, 2018 15:54:49

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 900
Репутация: +  160  -
Профиль   Отправить e-mail  

QSpinBox Qt5 передача значения в питон

Venus
можешь подсказать почему по нажатию кнопки старт на виджете, внешний скрипт и функция запускается но виджет виснет, если не закрыват то видно как скрипт продолжает работать(выводит там чтото)) ) закроешь и усё?
Могу, я уже обьяснял два раза, и даже пример написал который наглядно это демонстрирует. Когда запущен ГУИ то работает главный обработчик событий отвечающий за отрисовку картинки и реагирует на разные события как то нажитие кнопок, передвижение мышки и т.д. Это бесконечный цикл. когда ты запускаешь “внешний скрипт” и если там есть чтото типа
 while True:
    .........
то этот вайл-Тру не дает работать обработчику КуТе(программа то однопоточная и пока твой вайл-тру не отработает обработчик не получит управление) и ГУИ “виснет”. Чтобы этого не происходило скрипты по типу while-True: нужно или запускать в отдельном потоке/процессе, или интергировать уже непосредственно в сам главный обработчик КуТе. Например в QT есть QTimer() который может запускать процедуру-функцию-метод с определенным интервалом, вместо того чтобы использовать time.sleep

Отредактировано PEHDOM (Июль 13, 2018 15:55:25)

Офлайн

#7 Июль 13, 2018 16:19:39

Venus
Зарегистрирован: 2017-05-19
Сообщения: 55
Репутация: +  0  -
Профиль   Отправить e-mail  

QSpinBox Qt5 передача значения в питон

PEHDOM
плииин! в модуле есть в функции вайл тру и не один! а здесь нельзя прописать чоб виджет останавливал опрос или как то чтото но внешний скрипт продолжал бы работать
 def Start(self):
        здесь?

Офлайн

#8 Июль 13, 2018 16:35:51

Venus
Зарегистрирован: 2017-05-19
Сообщения: 55
Репутация: +  0  -
Профиль   Отправить e-mail  

QSpinBox Qt5 передача значения в питон

PEHDOM
почитал по потокам там примеры на с== (((
думаю мне подойдёт “или запускать в отдельном потоке/процессе” примеры на с ++ жуууть( не понимаю как на питон перевести)

Отредактировано Venus (Июль 13, 2018 16:43:46)

Офлайн

#9 Июль 13, 2018 17:26:08

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 900
Репутация: +  160  -
Профиль   Отправить e-mail  

QSpinBox Qt5 передача значения в питон

Venus
плииин! в модуле есть в функции вайл тру и не один! а здесь нельзя прописать чоб виджет останавливал опрос или как то чтото но внешний скрипт продолжал бы работать
Неа, так как у тебя два(или больше) бесконечных цикла, нужно или два потока\процесса , или попытаться встроить элементы одного цикла в другой.
у КуТе есть свой велосипед модуль для работы с потоками QThread, так же есть модуль threading и multiprocessing для паралельной работы. Есть еще subprocess . Универсального решения нет и какой из методов выбрать нужно смотреть каждый раз по ситуации.
вкратце о каждом можно ознакомиться тут https://ru.wikibooks.org/wiki/%D0%A3%D1%87%D0%B5%D0%B1%D0%BD%D0%B8%D0%BA_Python/%D0%9F%D1%80%D0%BE%D1%86%D0%B5%D1%81%D1%81%D1%8B_%D0%B8_%D0%BF%D0%BE%D1%82%D0%BE%D0%BA%D0%B8

Отредактировано PEHDOM (Июль 13, 2018 17:32:25)

Офлайн

#10 Июль 13, 2018 18:02:48

Venus
Зарегистрирован: 2017-05-19
Сообщения: 55
Репутация: +  0  -
Профиль   Отправить e-mail  

QSpinBox Qt5 передача значения в питон

PEHDOM
во внешнем модуле(скрипта) есть
 def stop():
    print("Перезапуск",r,type(r))
    time.sleep(r)
    stop() #перезапуск дефа стоп(равносильно вайлу подвисает виджет

как передать значения во внешний модуль, разобрался(не лучший пример), из виджета
def Start():
restartscript1 = self.ui.textEdit_9.toPlainText()
названиемодуля.restartscript = int(restartscript1)
названиемодуля.stop()
по приведённым вам примерам по ссылке думаю этот нужен(незнаю как его впихнуть в деф старт)
from threading import Thread
from time import sleep

class MyThread(Thread):

def __init__(self):
Thread.__init__(s

и совсем непонятно что это(откуда переменные взялись)
c = MyThread()
b = MyThread()
b.setDaemon(True)
c.start()
b.start()
c.join() # дождаться завершения потока в основном потоке
print “finish”

Отредактировано Venus (Июль 13, 2018 19:48:03)

Офлайн

  • Начало
  • » GUI
  • » QSpinBox Qt5 передача значения в питон[RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version