Класс Qt для всплывающего графического окна ⇐ Python
-
Гость
Класс Qt для всплывающего графического окна
В настоящее время я работаю над превращением моего графического скрипта во всплывающее окно. У меня есть главное окно, которое отвечает за прием вводимых пользователем данных по осям графиков. В этом главном окне также есть кнопка запуска для запуска физического прибора, который собирает данные для графиков. Я хочу, чтобы скрипт построения графиков появлялся в виде отдельного окна при нажатии кнопки «Пуск», а затем отображал данные в режиме реального времени по мере их поступления. Вот что у меня есть на данный момент:
# Импортируйте необходимые библиотеки импортировать систему время импорта импортировать случайный импортировать numpy как np # Вот все, что нужно для построения сюжета # Мне интересно, является ли этот импорт тем, что встраивает графики matplotlib в # Qt-виджет из PyQt5.QtWidgets импортируйте QApplication, QDialog, QWidget, QPushButton, QVBoxLayout из matplotlib.backends.qt_compat импортировать QtWidgets из импорта matplotlib.backends.backend_qt5agg ( РисунокCanvas, NavigationToolbar2QT как NavigationToolbar) # Это все библиотеки matplotlib, необходимые для подграфиков. из matplotlib.figure импортировать рисунок из matplotlib.colors импорт ListedColormap, LinearSegmentedColormap импортировать matplotlib как mpl импортировать matplotlib.pyplot как plt # Возможно, именно из-за этого мои подграфики имеют горизонтальную ориентацию из mpl_toolkits.axes_grid1 импорт make_axes_locatable # Краткое примечание: в финальной версии это должен быть класс виджета, чтобы его можно было запускать из главного окна kalamari. # но я думаю, что это просто изменит способ инициализации класса '''ВНИМАНИЕ: необходимо следовать объектно-ориентированному программированию''' # Создаём класс ApplicationWindow класс PopupWidget(QDialog): # Метод __init__ известен как инициализатор объекта. # Он определяет и устанавливает начальные значения для ваших атрибутов # Первый аргумент большинства методов — self. Он содержит ссылку на # текущий объект, чтобы вы могли использовать его внутри класса защита __init__(сам): # настраиваем окно '''Появляется дикий суперкласс!''' # Мне нужно более подробно изучить суперклассы # Что это вообще такое? супер().__init__() self._main = QtWidgets.QWidget() # self.setCentralWidget(self._main) # Кажется, что этот макет позволит мне # ориентируем все три подграфика на одну ось Y макет = QtWidgets.QVBoxLayout(self._main) # Создание отдельных объектов холста # Первый параметр figsize изменит ширину # Второй параметр изменит высоту first_canvas = РисунокCanvas(Рисунок(figsize=(9, 4))) макет.addWidget(NavigationToolbar(first_canvas, self)) макет.addWidget(first_canvas) # Добавляем подграфики на первый холст # Аргументы относятся к числу в каждой строке и столбце соответственно # Обратите внимание на использование подчеркивания перед first_axs # Это соглашение об именах закрытого члена # Обычно используются закрытые члены, чтобы гарантировать безопасное использование. # вашего кода # Python на самом деле не делает различия между общедоступными и закрытыми # Это всего лишь соглашение self._first_axs = first_canvas.figure.subplots(1, 3) # Теперь о создании данных # Я думаю, что хочу вывести эти данные из класса # Я забыл, что здесь сказала Отэм по этому поводу х = np.linspace(0, 10, 10) у = np.linspace(0, 10, 10) # Для окончательной версии вы можете использовать x для потока и y для смещений, а затем # каждая строка z представляет собой напряжение, такое, что: # z[i,j] равно V(смещение[j], поток) # Тогда вот данные, которые я буду использовать для определения цвета: # это должно иметь тот же размер, что и координаты z = np.random.rand(10, 10) # Это отвечает за создание нашей пользовательской цветовой панели # Цвета, приведенные здесь, имитируют цвета, которые можно увидеть в документах Вейцмана. custom_cmap = mpl.colors.LinearSegmentedColormap.from_list( "custom", ["#00008B", "синий", "голубой", "зеленый", "желтый", "оранжевый", "красный", "#8B0000"]) # Пометьте каждый подграфик self._first_axs[0].set_title( 'Я' + и'\u209B' + и'\u2092' + и'\u209C') self._first_axs[1].set_title( 'dI' + u'\u209B' + u'\u2092' + u'\u209C' + '/dH') self._first_axs[2].set_title('Шум') # Установите соотношение сторон 1, чтобы каждый график был идеально квадратным. self._first_axs[0].set_aspect(1) self._first_axs[1].set_aspect(1) self._first_axs[2].set_aspect(1) # Вывод данных и создание цветных полос # Обратите внимание на использование контура. Это создает более плавные цветовые градиенты. # для целей визуализации self.plot1 = self._first_axs[0].contourf( x, y, z, уровни=20, cmap=custom_cmap) self.plot2 = self._first_axs[1].contourf( x, y, z, уровни=20, cmap=custom_cmap) self.plot3 = self._first_axs[2].contourf( x, y, z, уровни=20, cmap=custom_cmap) self.cbar1 = first_canvas.figure.colorbar( self.plot1, ax=self._first_axs[0], ориентация='горизонтальная') self.cbar2 = first_canvas.figure.colorbar( self.plot2, ax=self._first_axs[1], ориентация='горизонтальная') self.cbar3 = first_canvas.figure.colorbar( self.plot3, ax=self._first_axs[2], ориентация='горизонтальная') ''' Здесь я размещаю графики в реальном времени. ''' def RealTimePlot(self, xPointsArray, yPointsArray): # Умножьте количество точек потока на количество точек смещения, чтобы # посчитаем количество итераций self.niter = len(xPointsArray) * len(yPointsArray) # Это команда, взятая из файла RealTimePlottingwithThreeSubplots.py. # В скобках отсутствуют обязательные аргументы; следовательно, существует только # один график, созданный из этого кода # Устанавливает соотношение сторон осей # Соотношение равно 1, чтобы создать идеально квадратный график # ax.set_aspect(1) # Создаем циклы # Инициализируем внешний цикл j = 0 для j в диапазоне (нитр): # Это команда, используемая для очистки текущих осей # Для перебора подграфиков создайте цикл for # Наш верхний диапазон будет равен 3, так как есть 3 подграфика # Инициализируем i как 0 я = 0 для меня в диапазоне (3): # Наш первый шаг — очистить оси нашего подграфика # Обратите внимание на использование i при ссылке на сюжет ApplicationWindow._first_axs.cla() # Теперь перерисуем все # Контур отвечает за интерполяцию данных # (интерполяция может быть здесь неправильным выбором слов) # Сглаживает градиент axs.contourf(x, y, z) # Теперь перерисовываем холст рис.canvas.draw() # Кто это #Что они здесь делают # Почему я не могу найти никакой документации по этому вопросу рендерер = fig.canvas.renderer ax.draw(рендерер) # Приращение я += 1 # Это должно быть время до повторения цикла? # Я не думаю, что нам это понадобится в нашем коде # plt.pause(0.01) j += 1 класс MainApp (QWidget): защита __init__(сам): супер().__init__() self.setWindowTitle("Главное окно") # Создаем кнопку для открытия всплывающего окна self.open_button = QPushButton("Открыть всплывающее окно") self.open_button.clicked.connect(self.show_popup) макет = QVBoxLayout() макет.addWidget(self.open_button) self.setLayout(макет) защита show_popup (сам): всплывающее окно = PopupWidget() всплывающее окно.exec_() если __name__ == '__main__': приложение = QApplication(sys.argv) app.setQuitOnLastWindowClosed(True) main_window = ГлавноеПриложение() main_window.show() sys.exit(app.exec_()) Этот код создает всплывающее окно; однако окно совершенно пусто. Может ли кто-нибудь помочь мне заставить мою графическую программу фактически заполнить всплывающее окно?
В настоящее время я работаю над превращением моего графического скрипта во всплывающее окно. У меня есть главное окно, которое отвечает за прием вводимых пользователем данных по осям графиков. В этом главном окне также есть кнопка запуска для запуска физического прибора, который собирает данные для графиков. Я хочу, чтобы скрипт построения графиков появлялся в виде отдельного окна при нажатии кнопки «Пуск», а затем отображал данные в режиме реального времени по мере их поступления. Вот что у меня есть на данный момент:
# Импортируйте необходимые библиотеки импортировать систему время импорта импортировать случайный импортировать numpy как np # Вот все, что нужно для построения сюжета # Мне интересно, является ли этот импорт тем, что встраивает графики matplotlib в # Qt-виджет из PyQt5.QtWidgets импортируйте QApplication, QDialog, QWidget, QPushButton, QVBoxLayout из matplotlib.backends.qt_compat импортировать QtWidgets из импорта matplotlib.backends.backend_qt5agg ( РисунокCanvas, NavigationToolbar2QT как NavigationToolbar) # Это все библиотеки matplotlib, необходимые для подграфиков. из matplotlib.figure импортировать рисунок из matplotlib.colors импорт ListedColormap, LinearSegmentedColormap импортировать matplotlib как mpl импортировать matplotlib.pyplot как plt # Возможно, именно из-за этого мои подграфики имеют горизонтальную ориентацию из mpl_toolkits.axes_grid1 импорт make_axes_locatable # Краткое примечание: в финальной версии это должен быть класс виджета, чтобы его можно было запускать из главного окна kalamari. # но я думаю, что это просто изменит способ инициализации класса '''ВНИМАНИЕ: необходимо следовать объектно-ориентированному программированию''' # Создаём класс ApplicationWindow класс PopupWidget(QDialog): # Метод __init__ известен как инициализатор объекта. # Он определяет и устанавливает начальные значения для ваших атрибутов # Первый аргумент большинства методов — self. Он содержит ссылку на # текущий объект, чтобы вы могли использовать его внутри класса защита __init__(сам): # настраиваем окно '''Появляется дикий суперкласс!''' # Мне нужно более подробно изучить суперклассы # Что это вообще такое? супер().__init__() self._main = QtWidgets.QWidget() # self.setCentralWidget(self._main) # Кажется, что этот макет позволит мне # ориентируем все три подграфика на одну ось Y макет = QtWidgets.QVBoxLayout(self._main) # Создание отдельных объектов холста # Первый параметр figsize изменит ширину # Второй параметр изменит высоту first_canvas = РисунокCanvas(Рисунок(figsize=(9, 4))) макет.addWidget(NavigationToolbar(first_canvas, self)) макет.addWidget(first_canvas) # Добавляем подграфики на первый холст # Аргументы относятся к числу в каждой строке и столбце соответственно # Обратите внимание на использование подчеркивания перед first_axs # Это соглашение об именах закрытого члена # Обычно используются закрытые члены, чтобы гарантировать безопасное использование. # вашего кода # Python на самом деле не делает различия между общедоступными и закрытыми # Это всего лишь соглашение self._first_axs = first_canvas.figure.subplots(1, 3) # Теперь о создании данных # Я думаю, что хочу вывести эти данные из класса # Я забыл, что здесь сказала Отэм по этому поводу х = np.linspace(0, 10, 10) у = np.linspace(0, 10, 10) # Для окончательной версии вы можете использовать x для потока и y для смещений, а затем # каждая строка z представляет собой напряжение, такое, что: # z[i,j] равно V(смещение[j], поток) # Тогда вот данные, которые я буду использовать для определения цвета: # это должно иметь тот же размер, что и координаты z = np.random.rand(10, 10) # Это отвечает за создание нашей пользовательской цветовой панели # Цвета, приведенные здесь, имитируют цвета, которые можно увидеть в документах Вейцмана. custom_cmap = mpl.colors.LinearSegmentedColormap.from_list( "custom", ["#00008B", "синий", "голубой", "зеленый", "желтый", "оранжевый", "красный", "#8B0000"]) # Пометьте каждый подграфик self._first_axs[0].set_title( 'Я' + и'\u209B' + и'\u2092' + и'\u209C') self._first_axs[1].set_title( 'dI' + u'\u209B' + u'\u2092' + u'\u209C' + '/dH') self._first_axs[2].set_title('Шум') # Установите соотношение сторон 1, чтобы каждый график был идеально квадратным. self._first_axs[0].set_aspect(1) self._first_axs[1].set_aspect(1) self._first_axs[2].set_aspect(1) # Вывод данных и создание цветных полос # Обратите внимание на использование контура. Это создает более плавные цветовые градиенты. # для целей визуализации self.plot1 = self._first_axs[0].contourf( x, y, z, уровни=20, cmap=custom_cmap) self.plot2 = self._first_axs[1].contourf( x, y, z, уровни=20, cmap=custom_cmap) self.plot3 = self._first_axs[2].contourf( x, y, z, уровни=20, cmap=custom_cmap) self.cbar1 = first_canvas.figure.colorbar( self.plot1, ax=self._first_axs[0], ориентация='горизонтальная') self.cbar2 = first_canvas.figure.colorbar( self.plot2, ax=self._first_axs[1], ориентация='горизонтальная') self.cbar3 = first_canvas.figure.colorbar( self.plot3, ax=self._first_axs[2], ориентация='горизонтальная') ''' Здесь я размещаю графики в реальном времени. ''' def RealTimePlot(self, xPointsArray, yPointsArray): # Умножьте количество точек потока на количество точек смещения, чтобы # посчитаем количество итераций self.niter = len(xPointsArray) * len(yPointsArray) # Это команда, взятая из файла RealTimePlottingwithThreeSubplots.py. # В скобках отсутствуют обязательные аргументы; следовательно, существует только # один график, созданный из этого кода # Устанавливает соотношение сторон осей # Соотношение равно 1, чтобы создать идеально квадратный график # ax.set_aspect(1) # Создаем циклы # Инициализируем внешний цикл j = 0 для j в диапазоне (нитр): # Это команда, используемая для очистки текущих осей # Для перебора подграфиков создайте цикл for # Наш верхний диапазон будет равен 3, так как есть 3 подграфика # Инициализируем i как 0 я = 0 для меня в диапазоне (3): # Наш первый шаг — очистить оси нашего подграфика # Обратите внимание на использование i при ссылке на сюжет ApplicationWindow._first_axs.cla() # Теперь перерисуем все # Контур отвечает за интерполяцию данных # (интерполяция может быть здесь неправильным выбором слов) # Сглаживает градиент axs.contourf(x, y, z) # Теперь перерисовываем холст рис.canvas.draw() # Кто это #Что они здесь делают # Почему я не могу найти никакой документации по этому вопросу рендерер = fig.canvas.renderer ax.draw(рендерер) # Приращение я += 1 # Это должно быть время до повторения цикла? # Я не думаю, что нам это понадобится в нашем коде # plt.pause(0.01) j += 1 класс MainApp (QWidget): защита __init__(сам): супер().__init__() self.setWindowTitle("Главное окно") # Создаем кнопку для открытия всплывающего окна self.open_button = QPushButton("Открыть всплывающее окно") self.open_button.clicked.connect(self.show_popup) макет = QVBoxLayout() макет.addWidget(self.open_button) self.setLayout(макет) защита show_popup (сам): всплывающее окно = PopupWidget() всплывающее окно.exec_() если __name__ == '__main__': приложение = QApplication(sys.argv) app.setQuitOnLastWindowClosed(True) main_window = ГлавноеПриложение() main_window.show() sys.exit(app.exec_()) Этот код создает всплывающее окно; однако окно совершенно пусто. Может ли кто-нибудь помочь мне заставить мою графическую программу фактически заполнить всплывающее окно?
Мобильная версия