Форум сайта python.su
PEHDOMвставил ваш пример пишет AttributeError: module ‘PyQt5.QtGui’ has no attribute ‘QWidget’
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)
Офлайн
> вставил ваш пример пишет AttributeError: module ‘PyQt5.QtGui’ has no attribute ‘QWidget’
да у вас пятый куте, в нем виждеты перенесли в другой модуль, земените from “PyQt4 import QtGui” на “from PyQt5 import QtWidgets as QtGui” и все должно заработать, и посмотрите что выходит.
[code python][/code]
Отредактировано PEHDOM (Июль 12, 2018 16:24:52)
Офлайн
PEHDOMтерь это вывел - AttributeError: module ‘PyQt5.QtGui’ has no attribute ‘QGridLayout’
> вставил ваш пример пишет AttributeError: module ‘PyQt5.QtGui’ has no attribute ‘QWidget’да у вас пятый куте, в нем виждеты перенесли в другой модуль, земените from “PyQt4 import QtGui” на “from PyQt5 import QtWidgets as QtGui” и все должно заработать, и посмотрите что выходит.
Офлайн
можешь подсказать почему по нажатию кнопки старт на виджете, внешний скрипт и функция запускается но виджет виснет, если не закрыват то видно как скрипт продолжает работать(выводит там чтото)) ) закроешь и усё?
Офлайн
Venusвсе работает, проверял на куте5
терь это вывел - AttributeError: module ‘PyQt5.QtGui’ has no attribute ‘QGridLayout’
# 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_()
[code python][/code]
Отредактировано PEHDOM (Июль 13, 2018 16:05:21)
Офлайн
VenusМогу, я уже обьяснял два раза, и даже пример написал который наглядно это демонстрирует. Когда запущен ГУИ то работает главный обработчик событий отвечающий за отрисовку картинки и реагирует на разные события как то нажитие кнопок, передвижение мышки и т.д. Это бесконечный цикл. когда ты запускаешь “внешний скрипт” и если там есть чтото типа
можешь подсказать почему по нажатию кнопки старт на виджете, внешний скрипт и функция запускается но виджет виснет, если не закрыват то видно как скрипт продолжает работать(выводит там чтото)) ) закроешь и усё?
while True: .........
[code python][/code]
Отредактировано PEHDOM (Июль 13, 2018 15:55:25)
Офлайн
PEHDOMплииин! в модуле есть в функции вайл тру и не один! а здесь нельзя прописать чоб виджет останавливал опрос или как то чтото но внешний скрипт продолжал бы работать
def Start(self): здесь?
Офлайн
PEHDOMпочитал по потокам там примеры на с== (((
Отредактировано Venus (Июль 13, 2018 16:43:46)
Офлайн
VenusНеа, так как у тебя два(или больше) бесконечных цикла, нужно или два потока\процесса , или попытаться встроить элементы одного цикла в другой.
плииин! в модуле есть в функции вайл тру и не один! а здесь нельзя прописать чоб виджет останавливал опрос или как то чтото но внешний скрипт продолжал бы работать
[code python][/code]
Отредактировано PEHDOM (Июль 13, 2018 17:32:25)
Офлайн
PEHDOMво внешнем модуле(скрипта) есть
def stop(): print("Перезапуск",r,type(r)) time.sleep(r) stop() #перезапуск дефа стоп(равносильно вайлу подвисает виджет
Отредактировано Venus (Июль 13, 2018 19:48:03)
Офлайн