Причина такого поведения заключается в том, что создаваемый вами экземпляр quitto
является "сборщиком мусора". Как и многие языки более высокого уровня, Python имеет систему, которая автоматически управляет памятью и отвечает за освобождение памяти от объектов, которые «решают», больше не нужны.
Любая локальная переменная, созданная в функции всегда удаляется, как только функция возвращается, если только она не ссылается на постоянный объект каким-либо образом.
Следующий пример объясняет это более простым способом: «my_variable» создается в function
, но как как только он завершен (он возвращает) python удаляет эту переменную, и это хорошо, потому что если этого не произойдет, вы легко go нехватите памяти:
class DeletingObject(object):
'''
A basic class that prints a message whenever any of its instances
is going to be deleted.
'''
def __del__(self):
print('Goodbye cruel world...')
def function():
my_variable = DeletingObject()
print(my_variable)
>>> function()
<__main__.DeletingObject object at 0xb593a46c>
Goodbye cruel world...
То же самое происходит в вашем случае: вы создаете quitto
, но для него нет постоянной ссылки, поэтому, как только функция, которая его создает, возвращается, она удаляется.
Самый распространенный способ избежать этого, когда вы создание объектов внутри класса, это сделать новый объект атрибут экземпляра :
def QPushButtonQPressed(self):
<b>self.pippo</b> = quitto()
self.pippo.show()
Теперь новый объект больше не удаляется руда, и окно больше не будет разрушено.
Поскольку вы только начали изучать все это, я хотел бы поделиться некоторыми советами по поводу вашего примера:
- классы не должны быть объявлены внутри функций; в некоторых случаях это можно сделать, но они очень специфичны c ситуаций, которые обычно не нужны для использования generic c (основная причина в том, что классы должны быть доступны из любого места, чтобы их экземпляры могли быть созданы в любое время , но это также потому, что определение класса в функции означает, что он всегда объявляется при каждом запуске функции, что не очень хорошо для производительности);
- используют пустые строки в функциях только при разделении логических фрагментов вашего код, а не между каждой строкой;
- Для большинства языков принято использовать заглавные имена для классов и строчные имена для функций, переменных и экземпляров. Подробнее об этом читайте в официальном руководстве по стилю для Python (он же PEP-8);
- , хотя с технической точки зрения в этом нет ничего плохого, обычно лучше не смешивать способ импорта из модулей, особенно если имеется несколько уровней подмодулей (например, с PyQt): вы либо импортируете субмодуль как в первой строке (
from PyQt5 import QtWidgets
) или в отдельных классах, которые вы собираетесь использовать, как во втором импорте (from PyQt5.QtWidgets import QDesktopWidget
); второй подход обычно подходит для простых случаев, но если ваш код сильно растет, вы можете оказаться с десятками классов, которые нужно импортировать вручную, и хотя вы можете сделать from PyQt5.QtWidgets import *
, обычно лучше импортировать подмодули и получить доступ к классы оттуда:
from PyQt5 import QtWidgets
# ...
cp = QtWidgets.QDesktopWidget().availableGeometry().center()
- QDesktopWidget устарел, вместо него используйте QScreen ;