import sys
from PySide2.QtCore import QThread, Signal
from PySide2.QtWidgets import QApplication, QPushButton, QWidget
class Main(QWidget):
def __init__(self):
super(Main, self).__init__()
self.resize(300, 50)
self.pb = QPushButton(self)
self.pb.resize(300, 50)
self.pb.setText('start')
self.pb.clicked.connect(self.start_thread)
self.thread = Worker()
self.thread.some_signal.connect(self.__on_some_signal) # стандартный коннект сигнала и слота
def start_thread(self):
self.thread.start()
def __on_some_signal(self):
print('test')
self.pb.setText('some thread done!')
class Worker(QThread):
some_signal = Signal() # таки новый сигнал
def __init__(self):
super(Worker, self).__init__()
def run(self):
print('start looooong function')
QThread.sleep(1)
self.some_signal.emit() # испускаем наш сигнал
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Main()
ex.show()
sys.exit(app.exec_())
a = import_module('time', package='sleep')<- package не смущает?
importlib.import_module(name, package=None)
Import a module. The name argument specifies what module to import in absolute or relative terms (e.g. either pkg.mod or ..mod). If the name is specified in relative terms, then the package argument must be set to the name of the package which is to act as the anchor for resolving the package name (e.g. import_module('..mod', 'pkg.subpkg') will import pkg.mod).
The import_module() function acts as a simplifying wrapper around importlib.__import__(). This means all semantics of the function are derived from importlib.__import__(). The most important difference between these two functions is that import_module() returns the specified package or module (e.g. pkg.mod), while __import__() returns the top-level package or module (e.g. pkg).
If you are dynamically importing a module that was created since the interpreter began execution (e.g., created a Python source file), you may need to call invalidate_caches() in order for the new module to be noticed by the import system.
Changed in version 3.3: Parent packages are automatically imported.
lback_query_handler(func=lambda call: call.data == "requestphoto1")
def test_callback(call):
# считываем текущее время
tm_now = time()
# сравниваем с временем предыдущего вызова функции ( ведь есть же хранилище, в котором хранится предыдущее время, ведь так?)
# если условия по времени не удовлетворяют требованиям
if (tm_now - tm_last) < treshold:
# завершаем функцию. если времени прошло меньше, чем порог
return
files = []
for ext in ["png", "jpg", "jpeg", "PNG", "JPG", "JPEG"]:
[files.append(file) for file in glob.glob(f"test/*.{ext}")]
random_file = files[random.randint(0, len(files) - 1)]
with open(random_file, 'rb') as f:
bot.send_media_group(call.message.chat.id, [types.InputMediaPhoto(f, )])
bot.answer_callback_query(callback_query_id=call.id, text="Отправлено!")
from time import time
print(time())
from random import randint
from time import time, sleep
tm_last = time() # храним тут последнее зафиксированное время (секунды)
treshold = 5 # пороговое значение (секунды)
for _ in range(10):
sleep(randint(1, 10)) # спим случайное количество секунд из диапозона 1 - 10
tm_now = time() # текущее время
if (tm_now - tm_last) < treshold:
print(f'(tm_now - tm_last) < treshold | ({tm_now - tm_last}) < {treshold}')
else:
print(f'(tm_now - tm_last) > treshold | ({tm_now - tm_last}) > {treshold}')
tm_last = tm_now # записываем последнее обработанное время
@bot.callback_query_handler(func=lambda call: call.data == "requestphoto1")
def test_callback(call):
# считываем текущее время
tm_now = time()
# сравниваем с временем предыдущего вызова функции ( ведь есть же хранилище, в котором хранится предыдущее время, ведь так?)
# если условия по времени не удовлетворяют требованиям
if (tm_now - tm_last) < treshold:
do_something()
return
files = []
for ext in ["png", "jpg", "jpeg", "PNG", "JPG", "JPEG"]:
[files.append(file) for file in glob.glob(f"test/*.{ext}")]
random_file = files[random.randint(0, len(files) - 1)]
with open(random_file, 'rb') as f:
bot.send_media_group(call.message.chat.id, [types.InputMediaPhoto(f, )])
bot.answer_callback_query(callback_query_id=call.id, text="Отправлено!")
а стоп, имя же вкладки не сохраняется в объекте (ну и в списке соответственно)
если удалю вкладку - объект ведь так и останется?
ничего страшного?
TypeError: new_task() missing 1 required positional argument: 'self'Абсолютно все верно, так как:
self.suppliers_and_add_tasks.addTab(Task.new_task(), self.task_name.toPlainText())
Task.new_task()
class Foo:
def bar(self):
print('bar')
x = Foo()
x.bar()
Foo.bar()
<spoiler title="доп">
class Foo:
@staticmethod
def bar():
print('bar')
x = Foo()
x.bar()
Foo.bar()
elf.suppliers_and_add_tasks.addTab(Task.new_task(), self.task_name.toPlainText())- экземпляр не создается. В этом одна часть проблемы
def add_task_f(self):
created_new_task = Task() # создаем экземпляр класса Task и присваиваем его имени created_new_task
self.tasks.append(created_new_task ) # сохраняем ссылку на экземпляр путем добавления в список tasks основного класса.
#Можно не делать этого, но надо учитывать, что после выхода из метода, все переменные удаляться.
# Qt заберет владение этими объектами, но вытаскивать их потом тяжело.
# я подразумеваю, что self.tasks - создан и существует
# теперь тут мы вызываем метод new_task не класса, а экземпляра класса
self.suppliers_and_add_tasks.addTab(created_new_task .new_task(), self.task_name.toPlainText())
import sys
from PyQt5 import QtWidgets, QtGui, QtCore
from PyQt5.QtGui import QIcon
class Task:
def __init__(self):
super().__init__()
self.tab_2 = QtWidgets.QTabWidget()
self.tab_2.setObjectName("tab_2")
self.start_task = QtWidgets.QPushButton(self.tab_2)
self.start_task.setGeometry(QtCore.QRect(300, 510, 171, 23))
font = QtGui.QFont()
font.setPointSize(9)
self.start_task.setFont(font)
self.start_task.setObjectName("start_task")
self.start_task.clicked.connect(self.test)
def new_task(self):
return self.tab_2
def test(self):
print('111')
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(1479, 781)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(MainWindow.sizePolicy().hasHeightForWidth())
MainWindow.setSizePolicy(sizePolicy)
MainWindow.setMinimumSize(QtCore.QSize(1479, 781))
MainWindow.setMaximumSize(QtCore.QSize(1479, 781))
font = QtGui.QFont()
font.setPointSize(9)
MainWindow.setFont(font)
self.centralwidget = QtWidgets.QWidget(MainWindow)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.centralwidget.sizePolicy().hasHeightForWidth())
self.centralwidget.setSizePolicy(sizePolicy)
self.centralwidget.setMinimumSize(QtCore.QSize(1479, 781))
self.centralwidget.setMaximumSize(QtCore.QSize(1479, 781))
self.centralwidget.setObjectName("centralwidget")
self.all_tabs = QtWidgets.QTabWidget(self.centralwidget)
self.all_tabs.setGeometry(QtCore.QRect(0, 0, 1479, 781))
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.all_tabs.sizePolicy().hasHeightForWidth())
self.all_tabs.setSizePolicy(sizePolicy)
self.all_tabs.setMinimumSize(QtCore.QSize(1479, 781))
self.all_tabs.setMaximumSize(QtCore.QSize(1479, 781))
self.all_tabs.setObjectName("all_tabs")
self.all = QtWidgets.QWidget()
self.all.setObjectName("all")
self.supliers_and_tasks = QtWidgets.QWidget()
self.supliers_and_tasks.setObjectName("supliers_and_tasks")
self.suppliers_and_add_tasks = QtWidgets.QTabWidget(self.supliers_and_tasks)
self.suppliers_and_add_tasks.setGeometry(QtCore.QRect(0, 0, 1479, 761))
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.suppliers_and_add_tasks.sizePolicy().hasHeightForWidth())
self.suppliers_and_add_tasks.setSizePolicy(sizePolicy)
self.suppliers_and_add_tasks.setMinimumSize(QtCore.QSize(1479, 761))
self.suppliers_and_add_tasks.setMaximumSize(QtCore.QSize(1479, 761))
self.suppliers_and_add_tasks.setObjectName("suppliers_and_add_tasks")
self.tab = QtWidgets.QWidget()
self.tab.setObjectName("tab")
self.suppliers_and_add_tasks.addTab(self.tab, "")
self.all_tabs.addTab(self.supliers_and_tasks, "")
MainWindow.setCentralWidget(self.centralwidget)
self.groupBox_7 = QtWidgets.QGroupBox(self.tab)
self.groupBox_7.setGeometry(QtCore.QRect(670, 10, 471, 511))
self.groupBox_7.setObjectName("groupBox_7")
self.task_name = QtWidgets.QTextBrowser(self.groupBox_7)
self.task_name.setGeometry(QtCore.QRect(80, 60, 151, 25))
self.task_name.setLineWrapMode(QtWidgets.QTextEdit.WidgetWidth)
self.task_name.setReadOnly(False)
self.task_name.setAcceptRichText(False)
self.task_name.setObjectName("task_name")
self.add_task = QtWidgets.QPushButton(self.tab)
self.add_task.setGeometry(QtCore.QRect(750, 530, 121, 23))
self.add_task.setObjectName("add_task")
class ExampleApp(QtWidgets.QMainWindow):
def __init__(self):
super(ExampleApp, self).__init__()
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
self.ui.add_task.clicked.connect(self.add_task_f)
self.tasks = []
# добавление задачи
def add_task_f(self):
print('add_task_f')
created_new_task = Task()
self.tasks.append(created_new_task)
self.ui.suppliers_and_add_tasks.addTab(created_new_task.new_task(), self.ui.task_name.toPlainText())
def main():
app = QtWidgets.QApplication(sys.argv)
window = ExampleApp()
window.show()
app.exec_()
if __name__ == '__main__':
main()
при испускании сигнала, внезапно, испускается сигнал, а не выполняется функция. Код выполнится, когда до связанного слота дойдет очередь.
Правильно понимаю, что нужно в стороннем потоке обрабатывать сигналы?