我在PyQT4程序中有以下代码用于click处理程序:
def click_btn_get_info(self):
task = self.window.le_task.text()
self.statusBar().showMessage('Getting task info...')
def thread_routine(task_id):
order = self.ae.get_task_info(task_id)
if order:
info_str = "Customer: {email}\nTitle: {title}".format(**order)
self.window.lbl_order_info.setText(info_str)
self.statusBar().showMessage('Done')
else:
self.statusBar().showMessage('Authentication: failed!')
thread = threading.Thread(target=thread_routine, args=(task,))
thread.start()
在函数中声明函数与线程一起使用是一个好习惯吗?
答案 0 :(得分:5)
总的来说,是的,这是完全合理的。但是,创建单独方法(或者,对于顶级代码,单独的函数)的替代方法也非常合理。创建Thread
子类也是如此。所以,没有规则说要总是做三个中的一个;有不同的情况,每一个似乎比其他情况更合理,但这些情况之间有重叠,所以通常是一个判断调用。
正如Maxime所指出的,你可能想要使用Qt的线程,而不是本机Python线程。特别是因为您想要在GUI对象上调用方法。 Qt文档中的Qt文档文章Threads, Events and QObjects为您提供了概述(尽管来自C ++,而不是Python,观点)。如果您使用的是QThread
而不是threading.Thread
,则使用OO方法更为常见 - 定义QThread
的子类并覆盖其run
方法而不是定义一个函数,这使你的问题没有实际意义。
但是如果你坚持使用Python线程,这就是我的决定。
专业方法:
self
。Pro本地功能:
我可能会把它变成一种方法,但我不会抱怨别人的代码使它成为一个本地函数。
在不同的情况下 - 例如,如果线程需要访问没有业务的局部变量,或者它是一个简单的函数,我可以写为内联lambda,或者如果这是一个顶级的-level函数共享全局变量而不是共享self
的方法,我会转向另一个方向。