refactoring
This commit is contained in:
parent
c567ba6273
commit
c6e36a2f72
217
lab2_1/lab2_1.py
217
lab2_1/lab2_1.py
@ -1,65 +1,51 @@
|
||||
import os
|
||||
import sys
|
||||
import traceback
|
||||
|
||||
import cv2
|
||||
import numpy as np
|
||||
from matplotlib import pyplot as plt
|
||||
|
||||
|
||||
def menu():
|
||||
print("Выберите пункт меню:\n1.Linear filter\n2.Blur\n3.Median blur\n4.GaussianBlur\n5.Erode")
|
||||
print("6.Dilate\n7.MORPH_OPERATIONS\n8.Sobel\n9.Laplacian\n10.Canny\n11.CalcHist\n12.EqualizeHist")
|
||||
print("13.Save\n14.Add Figure\n15.Del Figure\n16.Exit")
|
||||
SOURCE_IMAGE = "test.jpg"
|
||||
|
||||
|
||||
def main():
|
||||
image1 = cv2.imread("D:\\MACH\\LAB_2\\image0.jpg")
|
||||
image2 = image1.copy()
|
||||
im = image1.copy()
|
||||
while True:
|
||||
menu()
|
||||
try:
|
||||
s = int(input())
|
||||
if s == 1:
|
||||
image2 = image1.copy()
|
||||
def filter_linear(image):
|
||||
kernel = np.array([[-0.1, 0.2, -0.1], [0.2, 3.0, 0.2], [-0.1, 0.2, -0.1]])
|
||||
image2 = cv2.filter2D(image2, -1, kernel)
|
||||
cv2.imshow("Image_load", image1)
|
||||
cv2.imshow("Result_Image", image2)
|
||||
cv2.waitKey(0)
|
||||
if s == 2:
|
||||
image2 = image1.copy()
|
||||
image2 = cv2.blur(image2, (5, 5))
|
||||
cv2.imshow("Image_load", image1)
|
||||
cv2.imshow("Result_Image", image2)
|
||||
cv2.waitKey(0)
|
||||
if s == 3:
|
||||
image2 = image1.copy()
|
||||
image2 = cv2.medianBlur(image2, 5)
|
||||
cv2.imshow("Image_load", image1)
|
||||
cv2.imshow("Result_Image", image2)
|
||||
cv2.waitKey(0)
|
||||
if s == 4:
|
||||
image2 = image1.copy()
|
||||
image2 = cv2.GaussianBlur(image2, (9, 9), cv2.BORDER_DEFAULT)
|
||||
cv2.imshow("Image_load", image1)
|
||||
cv2.imshow("Result_Image", image2)
|
||||
cv2.waitKey(0)
|
||||
if s == 5:
|
||||
image2 = image1.copy()
|
||||
image2 = cv2.erode(image2, np.ones((11, 11)))
|
||||
cv2.imshow("Image_load", image1)
|
||||
cv2.imshow("Result_Image", image2)
|
||||
cv2.waitKey(0)
|
||||
if s == 6:
|
||||
image2 = image1.copy()
|
||||
image2 = cv2.dilate(image2, np.ones((11, 11)))
|
||||
cv2.imshow("Image_load", image1)
|
||||
cv2.imshow("Result_Image", image2)
|
||||
cv2.waitKey(0)
|
||||
if s == 7:
|
||||
image2 = image1.copy()
|
||||
cv2.imshow("Исходное изображение", image)
|
||||
cv2.imshow("Результат", cv2.filter2D(image.copy(), -1, kernel))
|
||||
|
||||
|
||||
def filter_blur(image):
|
||||
cv2.imshow("Исходное изображение", image)
|
||||
cv2.imshow("Результат", cv2.blur(image.copy(), (5, 5)))
|
||||
|
||||
|
||||
def filter_median_blur(image):
|
||||
cv2.imshow("Исходное изображение", image)
|
||||
cv2.imshow("Результат", cv2.medianBlur(image.copy(), 5))
|
||||
|
||||
|
||||
def filter_gauss_blur(image):
|
||||
cv2.imshow("Исходное изображение", image)
|
||||
cv2.imshow("Результат", cv2.GaussianBlur(image.copy(), (9, 9), cv2.BORDER_DEFAULT))
|
||||
|
||||
|
||||
def filter_erode(image):
|
||||
cv2.imshow("Исходное изображение", image)
|
||||
cv2.imshow("Результат", cv2.erode(image.copy(), np.ones((11, 11))))
|
||||
|
||||
|
||||
def filter_dilate(image):
|
||||
cv2.imshow("Исходное изображение", image)
|
||||
cv2.imshow("Результат", cv2.dilate(image.copy(), np.ones((11, 11))))
|
||||
|
||||
|
||||
def filter_morph(image):
|
||||
# TODO переписать
|
||||
image2 = image.copy()
|
||||
image3 = cv2.cvtColor(image2, cv2.COLOR_BGR2GRAY)
|
||||
cv2.imshow("Image_load", image1)
|
||||
cv2.imshow("Image_load", image)
|
||||
kernel = np.ones((6, 6), np.uint8)
|
||||
image3 = cv2.morphologyEx(image3, cv2.MORPH_OPEN, kernel, iterations=1)
|
||||
cv2.imshow("MORPH_OPEN", image3)
|
||||
@ -76,86 +62,101 @@ def main():
|
||||
image3 = cv2.morphologyEx(image3, cv2.MORPH_BLACKHAT, kernel, iterations=1)
|
||||
cv2.imshow("MORPH_BLACKHAT", image3)
|
||||
image3 = cv2.cvtColor(image2, cv2.COLOR_BGR2GRAY)
|
||||
cv2.waitKey(0)
|
||||
if s == 8:
|
||||
image2 = image1.copy()
|
||||
|
||||
|
||||
def filter_sobel(image):
|
||||
image2 = image.copy()
|
||||
image3 = cv2.cvtColor(image2, cv2.COLOR_BGR2GRAY)
|
||||
image3 = cv2.GaussianBlur(image3, (3, 3), 0)
|
||||
im3 = cv2.Sobel(image3, cv2.CV_64F, 1, 0, ksize=5)
|
||||
im4 = cv2.Sobel(image3, cv2.CV_64F, 0, 1, ksize=5)
|
||||
im5 = cv2.Sobel(image3, cv2.CV_8UC1, 0, 1, ksize=5)
|
||||
cv2.imshow("Image_load", image1)
|
||||
cv2.imshow("Image_load", image)
|
||||
cv2.imshow("Result_Image_X", im3) # x
|
||||
cv2.imshow("Result_Image_Y", im4) # y
|
||||
cv2.imshow("Result_Gradient", im5) # gradient
|
||||
cv2.waitKey(0)
|
||||
if s == 9:
|
||||
image2 = image1.copy()
|
||||
|
||||
|
||||
def filter_laplacian(image):
|
||||
image2 = image.copy()
|
||||
image3 = cv2.cvtColor(image2, cv2.COLOR_RGB2GRAY)
|
||||
image3 = cv2.GaussianBlur(image3, (3, 3), 0)
|
||||
im3 = cv2.Laplacian(image3, cv2.CV_64F)
|
||||
cv2.imshow("Image_load", image1)
|
||||
cv2.imshow("Result_Image", im3) # x
|
||||
cv2.waitKey(0)
|
||||
if s == 10:
|
||||
image2 = image1.copy()
|
||||
image3 = cv2.cvtColor(image2, cv2.COLOR_RGB2GRAY)
|
||||
cv2.imshow("Image_load", image)
|
||||
cv2.imshow("Result_Image", im3)
|
||||
|
||||
|
||||
def filter_canny(image):
|
||||
image2 = image.copy()
|
||||
image3 = cv2.blur(image2, (5, 5))
|
||||
image3 = cv2.Canny(image3, 100, 100)
|
||||
cv2.imshow("Image_load", image1)
|
||||
cv2.imshow("Result_Image", image3) # x
|
||||
cv2.waitKey(0)
|
||||
if s == 11:
|
||||
image2 = image1.copy()
|
||||
cv2.imshow("Image_load", image)
|
||||
cv2.imshow("Result_Image", image3)
|
||||
|
||||
|
||||
def filter_calc_hist(image):
|
||||
image2 = image.copy()
|
||||
color = ('b', 'g', 'r')
|
||||
cv2.imshow("Image_load", image1)
|
||||
cv2.imshow("Image_load", image)
|
||||
for i, col in enumerate(color):
|
||||
histr = cv2.calcHist([image2], [i], None, [256], [0, 256])
|
||||
plt.plot(histr, color=col)
|
||||
plt.xlim([0, 256])
|
||||
plt.show()
|
||||
plt.close()
|
||||
cv2.waitKey(0)
|
||||
if s == 12:
|
||||
image2 = image1.copy()
|
||||
image2 = cv2.cvtColor(image2, cv2.COLOR_RGB2GRAY)
|
||||
image2 = cv2.equalizeHist(image2)
|
||||
cv2.imshow("Image_load", image1)
|
||||
cv2.imshow("Result_Image", image2)
|
||||
cv2.waitKey(0)
|
||||
if s == 13:
|
||||
cv2.imshow("Image_load", image1)
|
||||
cv2.imshow("Result_Image", image2)
|
||||
cv2.imwrite("D:\\im1.jpg", image1)
|
||||
cv2.imwrite("D:\\im2.jpg", image2)
|
||||
cv2.waitKey(0)
|
||||
if s == 14:
|
||||
image2 = image1.copy()
|
||||
cv2.imshow("Image_load", image1)
|
||||
image2 = cv2.line(image2, (15, 15), (270, 270), (76, 187, 23), 10) # линия
|
||||
image2 = cv2.rectangle(image2, (20, 20), (100, 100), (0, 0, 255), 10) # нарисуем четырехугольник
|
||||
image2 = cv2.circle(image2, (100, 100), 40, (0, 255, 0), 10) # нарисуем круг
|
||||
cv2.imshow("Result_Image", image2)
|
||||
image1 = image2
|
||||
cv2.waitKey(0)
|
||||
if s == 15:
|
||||
cv2.imwrite("1.jpg", im)
|
||||
cv2.imwrite("2.jpg", image1)
|
||||
img = cv2.imread("1.jpg")
|
||||
mask = cv2.imread("2.jpg", 0)
|
||||
res = cv2.bitwise_and(img, img, mask=mask)
|
||||
image2 = res.copy()
|
||||
image1 = res.copy()
|
||||
cv2.imshow("Result_Image", res)
|
||||
|
||||
|
||||
def filter_equalize_hist(image):
|
||||
cv2.imshow("Исходное изображение", image)
|
||||
cv2.imshow("Результат", cv2.equalizeHist(cv2.cvtColor(image.copy(), cv2.COLOR_RGB2GRAY)))
|
||||
|
||||
|
||||
functions_list = {
|
||||
"lf": {"func": filter_linear, "help": "Linear filter"},
|
||||
"bl": {"func": filter_blur, "help": "Blur"},
|
||||
"mb": {"func": filter_median_blur, "help": "Median blur"},
|
||||
"gb": {"func": filter_gauss_blur, "help": "GaussianBlur"},
|
||||
"er": {"func": filter_erode, "help": "Erode"},
|
||||
"di": {"func": filter_dilate, "help": "Dilate"},
|
||||
"mo": {"func": filter_morph, "help": "MORPH_OPERATIONS"},
|
||||
"so": {"func": filter_sobel, "help": "Sobel"},
|
||||
"la": {"func": filter_laplacian, "help": "Laplacian"},
|
||||
"ca": {"func": filter_canny, "help": "Canny"},
|
||||
"cl": {"func": filter_calc_hist, "help": "CalcHist"},
|
||||
"eh": {"func": filter_equalize_hist, "help": "EqualizeHist"},
|
||||
"q": {"func": lambda image: sys.exit(0), "help": "Exit"},
|
||||
}
|
||||
|
||||
|
||||
def print_help():
|
||||
print("Доступные функции:")
|
||||
for k in functions_list:
|
||||
print(f" {k} - {functions_list[k]['help']}")
|
||||
|
||||
|
||||
def main():
|
||||
image1 = cv2.imread(SOURCE_IMAGE)
|
||||
while True:
|
||||
try:
|
||||
cmd = input(">> ")
|
||||
if cmd == "":
|
||||
continue
|
||||
elif cmd == "?":
|
||||
print_help()
|
||||
else:
|
||||
if cmd in functions_list:
|
||||
try:
|
||||
functions_list[cmd]["func"](image=image1.copy())
|
||||
cv2.waitKey(0)
|
||||
os.remove("1.jpg")
|
||||
os.remove("2.jpg")
|
||||
if s == 16:
|
||||
cv2.destroyAllWindows()
|
||||
sys.exit(0)
|
||||
except ValueError:
|
||||
print("Неверный пункт меню!!!! Выберите другое!")
|
||||
except Exception:
|
||||
print("Произошла ошибка при выполнении функции")
|
||||
traceback.print_exc()
|
||||
else:
|
||||
print("Функция не найдена! введите '?' для получения справки")
|
||||
|
||||
except Exception:
|
||||
traceback.print_exc()
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
BIN
lab2_1/test.jpg
Normal file
BIN
lab2_1/test.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 110 KiB |
@ -2,12 +2,16 @@ import sys
|
||||
import cv2
|
||||
import numpy
|
||||
from PyQt5.QtGui import QImage, QPixmap
|
||||
from PyQt5.QtWidgets import QWidget, QApplication, QLabel, QVBoxLayout, QHBoxLayout, QPushButton, QFileDialog,QComboBox,QMessageBox
|
||||
from PyQt5.QtWidgets import QWidget, QApplication, QLabel, QVBoxLayout, QHBoxLayout, QPushButton, QFileDialog, \
|
||||
QComboBox, QMessageBox
|
||||
from PyQt5.QtCore import Qt
|
||||
from matplotlib import pyplot as plt
|
||||
|
||||
|
||||
class Example(QWidget):
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
self.image2 = None
|
||||
self.image = None
|
||||
self.label = QLabel()
|
||||
self.initUI()
|
||||
@ -22,7 +26,6 @@ class Example(QWidget):
|
||||
btn_procesar = QPushButton('Сохранить изображение')
|
||||
btn_procesar.clicked.connect(self.saveImage)
|
||||
|
||||
|
||||
f = open("Operate.txt", "r")
|
||||
attr = f.read().splitlines()
|
||||
f.close()
|
||||
@ -43,7 +46,8 @@ class Example(QWidget):
|
||||
self.show()
|
||||
|
||||
def openImage(self):
|
||||
self.filename, _ = QFileDialog.getOpenFileName(None, 'Buscar Imagen', '.', 'Image Files (*.png *.jpg *.jpeg *.bmp)')
|
||||
self.filename, _ = QFileDialog.getOpenFileName(None, 'Buscar Imagen', '.',
|
||||
'Image Files (*.png *.jpg *.jpeg *.bmp)')
|
||||
if self.filename:
|
||||
with open(self.filename, "rb") as file:
|
||||
data = numpy.array(bytearray(file.read()))
|
||||
@ -51,16 +55,11 @@ class Example(QWidget):
|
||||
self.mostrarImagen(self.image)
|
||||
self.image2 = self.image
|
||||
|
||||
|
||||
|
||||
|
||||
def saveImage(self):
|
||||
filename = QFileDialog.getSaveFileName(self, "QFileDialog.getSaveFileName()", "", "Image Files (*.jpg)")
|
||||
img = self.image2
|
||||
cv2.imwrite(filename[0], img)
|
||||
|
||||
|
||||
|
||||
def mostrarImagen(self, s):
|
||||
size = s.shape
|
||||
step = s.size / size[0]
|
||||
@ -75,7 +74,6 @@ class Example(QWidget):
|
||||
self.label.setPixmap(QPixmap.fromImage(img))
|
||||
self.resize(self.label.pixmap().size())
|
||||
|
||||
|
||||
def combobox(self, index):
|
||||
if index == 0:
|
||||
self.i0()
|
||||
@ -120,7 +118,6 @@ class Example(QWidget):
|
||||
if index == 20:
|
||||
self.i20()
|
||||
|
||||
|
||||
def i0(self):
|
||||
self.image2 = self.image
|
||||
self.mostrarImagen(self.image)
|
||||
@ -131,13 +128,11 @@ class Example(QWidget):
|
||||
self.image2 = cv2.filter2D(self.image2, -1, kernel)
|
||||
self.mostrarImagen(self.image2)
|
||||
|
||||
|
||||
def i2(self):
|
||||
self.image2 = self.image
|
||||
self.image2 = cv2.blur(self.image2, (5, 5))
|
||||
self.mostrarImagen(self.image2)
|
||||
|
||||
|
||||
def i3(self):
|
||||
self.image2 = self.image
|
||||
self.image2 = cv2.medianBlur(self.image2, 5)
|
||||
@ -188,7 +183,6 @@ class Example(QWidget):
|
||||
self.image2 = cv2.morphologyEx(self.image2, cv2.MORPH_BLACKHAT, kernel, iterations=1)
|
||||
self.mostrarImagen(self.image2)
|
||||
|
||||
|
||||
def i12(self):
|
||||
self.image2 = self.image
|
||||
self.image2 = cv2.cvtColor(self.image2, cv2.COLOR_BGR2GRAY)
|
||||
@ -233,7 +227,6 @@ class Example(QWidget):
|
||||
plt.xlim([0, 256])
|
||||
plt.show()
|
||||
|
||||
|
||||
def i18(self):
|
||||
self.image2 = self.image
|
||||
self.image2 = cv2.cvtColor(self.image2, cv2.COLOR_RGB2GRAY)
|
||||
@ -265,6 +258,7 @@ class Example(QWidget):
|
||||
else:
|
||||
event.ignore()
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
app = QApplication(sys.argv)
|
||||
win = Example()
|
||||
|
42
lab4/lab4.py
42
lab4/lab4.py
@ -1,32 +1,22 @@
|
||||
#import numpy as np
|
||||
#import cv2
|
||||
#img = cv2.imread("D:\MACH\LAB_4\crocodile\image_0001.jpg")
|
||||
#gray= cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
|
||||
#sift = cv2.SIFT_create()
|
||||
#kp = sift.detect(gray,None)
|
||||
#img=cv2.drawKeypoints(gray,kp,img)
|
||||
#cv2.imshow("R",img)
|
||||
#cv2.waitKey(0)
|
||||
#cv2.destroyAllWindows()
|
||||
import random
|
||||
import sys
|
||||
import cv2
|
||||
import numpy as np
|
||||
import random
|
||||
import math
|
||||
from PyQt5.QtCore import Qt
|
||||
from sklearn.ensemble import RandomForestClassifier
|
||||
from sklearn.metrics import accuracy_score
|
||||
from PyQt5.QtGui import QImage, QPixmap
|
||||
from PyQt5.QtWidgets import (QWidget, QApplication, QLabel, QVBoxLayout, QHBoxLayout, QPushButton,
|
||||
QFileDialog,QComboBox,QMessageBox,QTextBrowser)
|
||||
from PyQt5.QtCore import Qt
|
||||
|
||||
|
||||
class Example(QWidget):
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
self.image = None
|
||||
self.textbrowser = QTextBrowser()
|
||||
self.initUI()
|
||||
|
||||
def initUI(self):
|
||||
|
||||
self.btn_open = QPushButton('Изображения folder1')
|
||||
self.btn_open.clicked.connect(self.openImages1)
|
||||
@ -34,11 +24,9 @@ class Example(QWidget):
|
||||
self.btn_open1 = QPushButton('Изображения folder2')
|
||||
self.btn_open1.clicked.connect(self.openImages2)
|
||||
|
||||
|
||||
self.btn_ = QPushButton('Обучить и создать матрицы')
|
||||
self.btn_.clicked.connect(self.matrix_and_train)
|
||||
|
||||
|
||||
self.btn1 = QPushButton('Детектировать тестовые изображения')
|
||||
self.btn1.clicked.connect(self.detect_image)
|
||||
|
||||
@ -49,7 +37,6 @@ class Example(QWidget):
|
||||
self.btn1.setVisible(False)
|
||||
self.btn2.setVisible(False)
|
||||
|
||||
|
||||
top_bar = QHBoxLayout()
|
||||
top_bar.addWidget(self.btn_open)
|
||||
top_bar.addWidget(self.btn_open1)
|
||||
@ -64,7 +51,6 @@ class Example(QWidget):
|
||||
self.spisok2 = list()
|
||||
self.spisok3 = list()
|
||||
|
||||
|
||||
self.train = list()
|
||||
self.matrix = list()
|
||||
self.resize(540, 574)
|
||||
@ -72,15 +58,16 @@ class Example(QWidget):
|
||||
self.show()
|
||||
|
||||
def openImages1(self):
|
||||
filenames1 = QFileDialog.getOpenFileNames(None, 'Открыть изображения', '.', 'Image Files (*.png *.jpg *.jpeg *.bmp)')
|
||||
filenames1 = QFileDialog.getOpenFileNames(None, 'Открыть изображения', '.',
|
||||
'Image Files (*.png *.jpg *.jpeg *.bmp)')
|
||||
lk = filenames1[0]
|
||||
self.erroropened(lk, "1")
|
||||
self.mass(lk, 1)
|
||||
lk.clear()
|
||||
|
||||
|
||||
def openImages2(self):
|
||||
filenames2 = QFileDialog.getOpenFileNames(None, 'Открыть изображения', '.', 'Image Files (*.png *.jpg *.jpeg *.bmp)')
|
||||
filenames2 = QFileDialog.getOpenFileNames(None, 'Открыть изображения', '.',
|
||||
'Image Files (*.png *.jpg *.jpeg *.bmp)')
|
||||
lk = filenames2[0]
|
||||
self.erroropened(lk, "2")
|
||||
self.mass(lk, 2)
|
||||
@ -92,7 +79,6 @@ class Example(QWidget):
|
||||
else:
|
||||
q = QMessageBox.information(self, "Информация", "Вы не выбрали изображения!")
|
||||
|
||||
|
||||
def mass(self, p, s1):
|
||||
if s1 == 1:
|
||||
self.spisok3.clear()
|
||||
@ -109,7 +95,10 @@ class Example(QWidget):
|
||||
self.btn_open.setVisible(False)
|
||||
self.btn_open1.setVisible(False)
|
||||
self.btn_.setVisible(True)
|
||||
q=QMessageBox.information(self,"Информация","Количество изображений тестовой категории: "+str(len(self.spisok))+"\nКоличество изображений основной категории: "+str(len(self.spisok2))+"\nОбщее количество изображений: "+str(int(len(self.spisok)+int(len(self.spisok2)))))
|
||||
q = QMessageBox.information(self, "Информация", "Количество изображений тестовой категории: " + str(
|
||||
len(self.spisok)) + "\nКоличество изображений основной категории: " + str(
|
||||
len(self.spisok2)) + "\nОбщее количество изображений: " + str(
|
||||
int(len(self.spisok) + int(len(self.spisok2)))))
|
||||
|
||||
def matrix_and_train(self):
|
||||
for v in range(len(self.spisok3)):
|
||||
@ -130,7 +119,8 @@ class Example(QWidget):
|
||||
self.svm.train(train, cv2.ml.COL_SAMPLE, labels)
|
||||
self.svm.save("1.yml")
|
||||
self.textbrowser.append("Модель сохранена!")
|
||||
close = QMessageBox.question(self,"Поздравляем!","Ваша модель натренирована!",QMessageBox.Yes | QMessageBox.No)
|
||||
close = QMessageBox.question(self, "Поздравляем!", "Ваша модель натренирована!",
|
||||
QMessageBox.Yes | QMessageBox.No)
|
||||
if close == QMessageBox.Yes:
|
||||
pass
|
||||
self.btn_.setVisible(False)
|
||||
@ -175,7 +165,7 @@ class Example(QWidget):
|
||||
|
||||
# print(self.spisok3)
|
||||
for v in range(len(self.spisok2)):
|
||||
lk=list()
|
||||
lkst = list()
|
||||
img = cv2.imread(str(self.spisok2[v]))
|
||||
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
|
||||
sift = cv2.SIFT_create()
|
||||
@ -200,7 +190,6 @@ class Example(QWidget):
|
||||
# accuracy = accuracy_score(len(self.spisok3), len(self.spisok3))
|
||||
# print('Model Accuracy:',accuracy)
|
||||
|
||||
|
||||
def closeEvent(self, event):
|
||||
close = QMessageBox.question(self, "Выход", "Вы хотите завершить работу?", QMessageBox.Yes | QMessageBox.No)
|
||||
if close == QMessageBox.Yes:
|
||||
@ -208,6 +197,7 @@ class Example(QWidget):
|
||||
else:
|
||||
event.ignore()
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
app = QApplication(sys.argv)
|
||||
win = Example()
|
||||
|
Reference in New Issue
Block a user