要解决这个问题,您需要向您的对话框类添加一个'MODAL”事件处理程序。这样,当您单击对话框之外的区域时,对话框将保持打开状态。
以下是示例代码:
import bpy
class ExampleDialog(bpy.types.Operator): """Example Dialog Operator""" bl_idname = "object.example_dialog" bl_label = "Example Dialog"
def execute(self, context):
return {'FINISHED'}
def invoke(self, context, event):
wm = context.window_manager
return wm.invoke_props_dialog(self, width=400, height=200)
def modal(self, context, event):
if event.type == 'LEFTMOUSE':
if context.area.regions[-1].type == 'WINDOW':
return {'FINISHED'}
return {'PASS_THROUGH'}
def draw(self, context):
layout = self.layout
layout.label(text="Hello World!")
def register(): bpy.utils.register_class(ExampleDialog)
def unregister(): bpy.utils.unregister_class(ExampleDialog)
if name == "main": register()
# test call
bpy.ops.object.example_dialog('INVOKE_DEFAULT')
请注意,添加了MODAL事件处理程序后,需要在您的对话框类中添加一个draw()方法和一个execute()方法。示例代码包含这些方法的空实现。
添加此事件处理程序后,当您单击对话框之外的区域时,将调用modal()方法并将事件传递给它。在这个例子中,我们检查事件是否是左键单击,如果是的话,我们检查它是否在窗口区域内,如果是,我们返回{'FINISHED'},表示结束对话框。否则,我们返回{'PASS_THROUGH'},表示将事件传递给后续处理。